2013-10-03 73 views
17

我想使用Java中的gson解析一些JSON數據,它具有以下結構,但通過在線查看示例,找不到任何執行此項工作的東西。使用GSON解析嵌套的JSON數據

任何人都可以協助嗎?

{ 
    "data":{ 
     "id":[ 
      { 
       "stuff":{ 

       }, 
       "values":[ 
        [ 
         123, 
         456 
        ], 
        [ 
         123, 
         456 
        ], 
        [ 
         123, 
         456 
        ], 

       ], 
       "otherStuff":"blah" 
      } 
     ] 
    } 
} 

回答

39

你只需要創建一個代表JSON數據的Java類結構。爲了做到這一點,我建議你到你的JSON複製到此online JSON Viewer,你會看到你的JSON更清晰的結構...

基本上你需要這些類(僞代碼):

class Response 
    Data data 

class Data 
    List<ID> id 

class ID 
    Stuff stuff 
    List<List<Integer>> values 
    String otherStuff 

請注意,您類中的屬性名稱必須與您的JSON字段的名稱匹配!您可以根據您的實際JSON結構添加更多屬性和類別......還要注意,您需要獲取所有屬性的getter和setter!

最後,你只需要在JSON解析成Java類結構:

Gson gson = new Gson(); 
Response response = gson.fromJson(yourJsonString, Response.class); 

就是這樣!現在,您可以訪問所有的數據使用getter和setter的response對象中......

例如,爲了訪問第一個值456,你需要做的:

int value = response.getData().getId().get(0).getValues().get(0).get(1); 
+0

我走建議你http://json.parser.online.fr/的自由,它在PO提供的Json上也發現了一個語法錯誤。 – giampaolo

+0

我認爲[鏈接] [http://www.jsonschema2pojo.org]在爲您提供JSON響應和創建Java對象時非常有用! –

8

取決於你正在嘗試做什麼。你可以設置一個POJO heirarchy,匹配你的json,如here(首選方法)。或者,您可以提供自定義deserializer。我只處理了id數據,因爲我認爲這是棘手的問題。只需使用gson類型即可完成json,然後構建您試圖表示的數據。 DataId類只是pojos組成並反映了原始json字符串中的屬性。

public class MyDeserializer implements JsonDeserializer<Data> 
{ 

    @Override 
    public Data deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException 
    { 
    final Gson gson = new Gson(); 
    final JsonObject obj = je.getAsJsonObject(); //our original full json string 
    final JsonElement dataElement = obj.get("data"); 
    final JsonElement idElement = dataElement.getAsJsonObject().get("id"); 
    final JsonArray idArray = idElement.getAsJsonArray(); 

    final List<Id> parsedData = new ArrayList<>(); 
    for (Object object : idArray) 
    { 
     final JsonObject jsonObject = (JsonObject) object; 
     //can pass this into constructor of Id or through a setter 
     final JsonObject stuff = jsonObject.get("stuff").getAsJsonObject(); 
     final JsonArray valuesArray = jsonObject.getAsJsonArray("values"); 
     final Id id = new Id(); 
     for (Object value : valuesArray) 
     { 
     final JsonArray nestedArray = (JsonArray)value; 
     final Integer[] nest = gson.fromJson(nestedArray, Integer[].class); 
     id.addNestedValues(nest); 
     } 
     parsedData.add(id); 
    } 
    return new Data(parsedData); 
    } 

}

測試:

@Test 
    public void testMethod1() 
    { 
    final String values = "[[123, 456], [987, 654]]"; 
    final String id = "[ {stuff: { }, values: " + values + ", otherstuff: 'stuff2' }]"; 
    final String jsonString = "{data: {id:" + id + "}}"; 
    System.out.println(jsonString); 
    final Gson gson = new GsonBuilder().registerTypeAdapter(Data.class, new MyDeserializer()).create(); 
    System.out.println(gson.fromJson(jsonString, Data.class)); 
    } 

結果:

Data{ids=[Id {nestedList=[[123, 456], [987, 654]]}]} 

POJO:

public class Data 
{ 

    private List<Id> ids; 

    public Data(List<Id> ids) 
    { 
    this.ids = ids; 
    } 

    @Override 
    public String toString() 
    { 
    return "Data{" + "ids=" + ids + '}'; 
    } 
} 


public class Id 
{ 

    private List<Integer[]> nestedList; 

    public Id() 
    { 
    nestedList = new ArrayList<>(); 
    } 

    public void addNestedValues(final Integer[] values) 
    { 
    nestedList.add(values); 
    } 

    @Override 
    public String toString() 
    { 
    final List<String> formattedOutput = new ArrayList(); 
    for (Integer[] integers : nestedList) 
    { 
    formattedOutput.add(Arrays.asList(integers).toString()); 
    } 
    return "Id {" + "nestedList=" + formattedOutput + '}'; 
    } 
}