2017-06-06 52 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