2017-06-06 56 views
1

我知道这个问题或类似的问题在这里被多次询问,但我发誓我已经阅读了大量的相关文章,并没有任何解决方案似乎为我工作。如何将JSON数组映射/反序列化为POJO或POJO列表?

我试图将某些JSON数据(从特定的REST API接收)映射到Java类。该JSON格式是:

{"netStatLinks":[ 

{"src":"of:0000000000000002/3", 
"dst":"of:0000000000000000/1", 
"bw":10000.0, 
"rate":0.0, 
"usage":0.0, 
"available":10000.0}, 

{"src":"of:0000000000000005/3", 
"dst":"of:0000000000000006/1", 
"bw":10000.0, 
"rate":0.0, 
"usage":0.0, 
"available":10000.0}, 
{...and so on} 

]} 

的Java类我要地图的JSON的是:

public class NetStatLinkList { 
    private List<NetStatLink> netStatLinks; 

    // Generated getter and setter 

    @Override 
    public String toString(){ 
     return netStatLinks.toString(); 
    } 
} 

public class NetStatLink { 

    public String src; 
    public String dst; 
    public double bw; 
    public double rate; 
    public double usage; 
    public double available; 

    public NetStatLink(String src, String dst, double bw, double rate, double usage, double available){ 
     this.src = src; 
     this.dst = dst; 
     this.bw = bw; 
     this.rate = rate; 
     this.usage = usage; 
     this.available = available; 
    } 

    // Generated getters and setters 

    @Override 
    public String toString() { 
     return "Link "+src +"to"+ dst+" -- "+"rate: "+rate; 
    } 
} 

我可以正确读取JSON,但我可以无法以任何方式映射它。我已经尝试了所有这选项没有成功(请注意,URL基于URL字符串创建的URL对象,并且所有neccessary异常含蓄逮住):

使用杰克逊JSON直接映射到NetStatLinkList

ObjectMapper mapper = new ObjectMapper(); 
NetStatLinkList linkLst = mapper.readValue(url,NetStatLinkList.class); 

使用杰克逊的JSON映射到NetStatLink的对象列表

TypeReference<List<NetStatLink>> type = new TypeReference<List<NetStatLink>>() {}; 
List<NetStatLink> linkLst = mapper.readValue(url, mapType); 

使用杰克逊JSON字符串直接映射到类/对象

JsonNode rootNode = mapper.readValue(url,JsonNode.class); 
JsonNode data = rootNode.get("netStatLinks"); 
List<NetStatLink> linkLst = mapper.readValue(data.toString(), mapType); 
// or 
NetStatLink[] linkLst = mapper.readValue(data.toString(), NetStatLink[].class) 
// or 
List<NetStatLink> linkLst = mapper.readValue(data.traverse(), mapType); 

使用杰克逊到JSON映射到ArrayNode和遍历它

JsonNode linkData = mapper.readTree(url); 
ArrayNode linkDataArray = (ArrayNode)linkData.get("netStatLinks"); 
List<NetStatLink> linkLst; 

while(linkDataArray.elements().hasNext()){ 
    linkLst.add(mapper.readValue(linkDataArray.elements().next().toString(),NetStatLink.class)); 
} 

使用的列表外部库json-简单地阅读JSON,然后将其与Jackson映射。

String location = IOUtils.toString(url); 
JSONObject jo = (JSONObject) JSONValue.parseWithException(location); 

JSONArray val = (JSONArray) jo.get("NetStatLinks"); 
List<NetStatLink> linkLst = mapper.readValue(val.toJSONString(), mapType); 
// or 
NetStatLink[] linksList = mapper.readValue(val.toJSONString(), NetStatLink[].class); 

您是否知道是否有其他方式可以将此JSON数据映射到我的类,或者如果在这些方法中存在任何错误,这是我无法让它们工作的原因?

回答

1

您可以使用GSON

<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --> 
    <dependency> 
     <groupId>com.google.code.gson</groupId> 
     <artifactId>gson</artifactId> 
     <version>2.8.1</version> 
    </dependency> 

JsonParser jsonParser = new JsonParser(); 
      JsonObject jo = (JsonObject)jsonParser.parse(str); 
      JsonArray jsonArr = jo.getAsJsonArray("netStatLinks"); 

    List<NetStatLink> users = new ArrayList<NetStatLink>(); 
     Gson gson = new Gson(); 
     Type listType = new TypeToken<List<NetStatLink>>(){}.getType(); 
     netStatLink = gson.fromJson(jsonArr ,listType); 
+0

我会尝试,但只有一个问题:什么是可变的'到底是什么?我的意思是,它是按照收到格式化的JSON,从JSON数据中取得的“netStatLinks”的值,JSON转换成一个字符串......? – Sizigia

+0

我会尽快更新我的答案 –

+0

太好了,非常感谢! – Sizigia