2017-04-08 62 views
0

我一直在使用Jackson编写Rest服务来提取响应值内的名称和sizeFromStorage。尝试读取嵌套在JSON中的数组中的值

我创建了下面的类,试图做到这一点:

import java.util.List; 

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 

@JsonIgnoreProperties(value = {"status", "header"}) 
public class Vaults { 

private List<Object> response; 

public Vaults(){ 

} 

public Vaults(List<Object> response){ 
    this.response = response; 
} 

public List<Object> getResponse(){ 
    return response; 
} 

public void setResponse(List<Object> response) { 
    this.response = response; 
} 

@Override 
public String toString() { 
    return "" + response; 
} 
} 


import java.io.IOException; 
import java.util.List; 
import java.util.ArrayList; 

import com.fasterxml.jackson.databind.DeserializationFeature; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.type.CollectionType; 
import java.io.InputStream; 

public class JacksonObjectModelTest { 

public static void main(String[] args) throws IOException { 
    String jsonFileName = "/JsonRead/json.json"; 
    List<Vaults> emps = new JacksonObjectModelTest().getVaultList(jsonFileName); 
    System.out.println(emps.toString()); 
} 

public ArrayList<Vaults> getVaultList(String jsonFileName) throws IOException { 
    //read json file data to String 
    InputStream inputStream = getClass().getResourceAsStream(jsonFileName); 

    //create ObjectMapper instance 
    ObjectMapper objectMapper = new ObjectMapper().enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); 

    //convert json string to object 
    CollectionType collectionType = objectMapper.getTypeFactory().constructCollectionType(List.class, Vaults.class); 
    ArrayList<Vaults> emps = objectMapper.readValue(inputStream, collectionType); 
    return (ArrayList<Vaults>) emps; 
} 
} 

{ 
    "status": "ok", 
    "header": { 
    "now": 1491545894581, 
    "status": "ok", 
    "requestId": "WOcvJsCoAmoAAESbkBYAAAB5" 
    }, 
    "response": { 
    "vault": [ 
     { 
    "id": 20, 
    "name": "Apple", 
    "description": "", 
    "sizeFromStorage": 95957225298, 
    "storagePools": [ 
     { 
     "storagePool": { 
      "id": 1, 
      "name": "storage-pool1", 
      "sizeFromStorage": 95957225298, 
      "generations": [ 
      { 
       "generation": { 
       "sequence": 0 
       } 
      } 
      ] 
     } 
     } 
    ] 
    }, 
    { 
    "id": 21, 
    "name": "Banana", 
    "description": "", 
    "sizeFromStorage": 98957268244, 
    "storagePools": [ 
     { 
     "storagePool": { 
      "id": 2, 
      "name": "storage-pool1", 
      "sizeFromStorage": 98957268244, 
      "generations": [ 
      { 
       "generation": { 
       "sequence": 0 
       } 
      } 
      ] 
     } 
     } 
    ] 
    }, 
] 
    } 
} 

输出我从这个得到的是:

[[{vaults=[{id=20, name=Apple, description=, sizeFromStorage=95957225298, storagePools=[{storagePool={id=1, name=storage-pool1, sizeFromStorage=5043, estimateUsableTotalLogicalSizeFromStorage=95957225298, generations=[{generation={sequence=0}}]}}]}, {id=20, name=Apple, description=, sizeFromStorage=95957225298, storagePools=[{storagePool={id=1, name=storage-pool1, sizeFromStorage=5043, estimateUsableTotalLogicalSizeFromStorage=95957225298, generations=[{generation={sequence=0}}]}}]}]] 

不过,我想要做的是名称和sizeFromStorage值。到目前为止,我已经设法排除了前三个值。不幸的是我现在陷入困境,因为我对休息服务或阅读JSON不是很熟悉。有什么方法可以深入研究JSON以获得我需要的或者我以错误的方式接近它?

附加信息: 自发布我原来的问题,我想出了这个(基于东西,我在不同的网站上看到的):

package JsonRead; 

import java.io.File; 
import java.io.IOException; 

import com.fasterxml.jackson.databind.JsonNode; 
import com.fasterxml.jackson.databind.ObjectMapper; 

public class JacksonTreeModel { 
    public static void main(String[] args) { 

     try{ 

      ObjectMapper mapper = new ObjectMapper(); 

      JsonNode root = mapper.readTree(new File("JsonRead/json.json")); 

      JsonNode vaultsNode = root.path("response").path("vault"); 

      /*if(vaultsNode.isArray()){ 
       for(JsonNode node : vaultsNode){ 
        String name = node.path("name").asText(); 
        System.out.println("Array Name: " + name); 
       } 
      }*/ 

      for(JsonNode node : vaultsNode){ 
       String name = node.path("name").asText(); 
       String bytesUsed = node.path("sizeFromStorage").asText(); 
       System.out.println("Name: " + name + ", Bytes Used: " + bytesUsed); 
      } 

     } catch(IOException e){ 
       System.out.println("IO Exception " + e); 
     } 
    } 
} 

它适用于我想要什么,但有没有更好的方式来做这个?

请问,谢谢你的回复。我会研究你的建议。

回答

1

好的,所以我只是重新读你的问题。

建议创建一个VaultDAO对象,使其具有更有意义的自定义对象类型以用于响应集合。假设你使用相同的变量名(它看起来像你所知道的),那么它应该为你反序列化