2017-06-06 13 views
1

私はこの質問やそれに類するものがここで何度も尋ねられてきたことは知っていますが、私は関連記事をたくさん読んだことを誓っています。JSON配列をPOJOまたはPOJOリストにマップ/デシリアライズする方法は?

特定のREST APIから受け取ったJSONデータを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} 

]} 

私はこれであるためにJSONをマップするJavaクラス:

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例外は暗黙のうちにcatchedされていることを)成功せず、すべてこのオプションを試してみた:

が直接NetStatLinkList

にJSONをマップするためにジャクソンを使用しましたNetStatLinkのリストにJSONをマップするためにジャクソンを使用し
ObjectMapper mapper = new ObjectMapper(); 
NetStatLinkList linkLst = mapper.readValue(url,NetStatLinkList.class); 

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

オブジェクト直接クラスに/ ArrayNodeにJSONをマッピングし、それを介して使用

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)); 
} 

を反復するためにジャクソンを使用してオブジェクト

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文字列をマップするためにジャクソンを使用しました外部ライブラリJSON - JSONを読み込み、それをジャクソンとマッピングすることが簡単です。

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

あなたは

<!-- 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

私はそれを試してみましょう、しかしただ一つの質問をgson使用することができます:変数「s」が正確に何ですか?つまり、受け取ったJSON形式ですか、JSONデータから取った「netStatLinks」の値、JSONを文字列に変換したのでしょうか? – Sizigia

+0

私はすぐに私のansを更新します –

+0

素晴らしい、ありがとう! – Sizigia

関連する問題