2014-09-10 87 views
0

的JSON我有下面的示例JSON:GSON反序列化內嵌構件

{ 
"birds":[ 
    { 
    "id":"SAMPLEID", 
    "isTest":true, 
    "externalId":{ 
     "Main":[ 
      "123ABC" 
     ], 
     "Sub":[ 
      "456" 
     ] 
    }, 
    "dinos":[ 

    ], 
    "rhinos":[ 
     { 
      "id":"SUPER100ID", 
      "isTest":true, 
      "externalId":{ 
       "famousId":[ 
       "23|45" 
       ] 
      }, 
      "dinos":[ 

      ], 
      "pelicans":[ 
       { 
       "id":"D4CLIK", 
       "isTest":true, 
       "bird":null, 
       "crazyArray":[ 

       ] 
       }, 
       { 
       "id":"DID123", 
       "type":"B", 
       "name":"TONIE", 
       "isTest":true, 
       "bird":null, 
       "subspecies":[ 

       ] 
       } 
      ] 
     } 
    ] 
    } 
], 
"metaData":{ 
    "count":1 
} 
} 

我想用GSON反序列化這個JSON字符串並獲得「famousId」僅成員的值。

我看過其他答案,似乎我絕對需要爲此創建類。

是否有可能反序列化這個沒有映射POJO,使用JsonParser,JsonElement,JsonArray等?我嘗試了幾個這樣的組合,但沒有成功。

我也嘗試下面的代碼,但預期它也不能正常工作:

JsonObject o = new JsonParser().parse(jsonResponseString).getAsJsonObject(); 

Gson gson = new Gson(); 
enterprises ent = new enterprises(); 
ent = gson.fromJson(o, enterprises.class); 


@Getter 
@Setter 
class birds { 
    @JsonProperty("rhinos") 
    List<Rhino> rhinos = new ArrayList<Rhino>(); 
} 

@Getter 
@Setter 
class Rhino { 
    @JsonProperty("externalId") 
    ExternalId externalId; 
} 

@Getter 
@Setter 
@JsonPropertyOrder({ 
    "famousId" 
    }) 
class ExternalId { 
    @JsonProperty("famousId") 
    List<String> famousId = new ArrayList<String>(); 
} 

不幸的是這也不管用,所以我想一個問題的兩個部分...它可以簡單地反序列化並得到我想要的famousId的字符串值,以及我目前的類結構有什麼不正確的地方?

回答

1

你已經差不多完成了。我爲你的json結構添加了一個根類(Enterprises)。下面的代碼

class Enterprises { 
    List<Birds> birds; 
} 

class Birds { 
    List<Rhino> rhinos; 
} 

class Rhino { 
    ExternalId externalId; 
} 

class ExternalId { 
    List<String> famousId; 
} 

運行:

JsonObject o = new JsonParser().parse(jsonResponseString).getAsJsonObject(); 
Gson gson = new Gson(); 

Enterprises enterprises = gson.fromJson(o, Enterprises.class); 
System.out.println("famousId:" + enterprises.birds.get(0).rhinos.get(0).externalId.famousId.get(0)); 

輸出:

famousId:23|45 

或者,如果你不想使用POJO類:

JsonObject o = new JsonParser().parse(jsonResponseString).getAsJsonObject(); 
JsonArray birdsJsonArray = (JsonArray) o.get("birds"); 
JsonArray rhinosJsonArray = (JsonArray)((JsonObject)(birdsJsonArray.get(0))).get("rhinos"); 
JsonObject externalIdJsonObject = (JsonObject)((JsonObject)(rhinosJsonArray.get(0))).get("externalId"); 
JsonArray famousIdJsonArray = (JsonArray)externalIdJsonObject.get("famousId"); 

System.out.println("famousId:" + famousIdJsonArray.get(0)); 

輸出:

famousId:23|45 
+0

+1不錯的答案。 – 2014-09-20 13:32:21