2013-10-03 14 views
17

次の構造を持つJavaのgsonを使用してJSONデータを解析しようとしていますが、例をオンラインで見ても何も見つかりません。GSONを使用してネストされたJSONデータを解析する

誰でも手助けできますか?

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

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

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

答えて

39

JSONのデータを表すJavaクラス構造を作成するだけで済みます。

class Response 
    Data data 

class Data 
    List<ID> id 

class ID 
    Stuff stuff 
    List<List<Integer>> values 
    String otherStuff 
:、私はあなたがこの online JSON ViewerにあなたのJSONをコピーすることをお勧めして、あなたのJSONの構造がより明確に表示されますことを行うため...

では基本的には、これらのクラス(擬似コード)が必要です

クラスの属性名は、JSONフィールドの名前と一致する必要があります。実際のJSON構造に従って属性やクラスを追加することもできます...すべての属性に対してgetterとsetterが必要です。

最後に、あなただけで、あなたのJavaクラス構造にJSONをパースする必要があります。

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

そして、それはそれです!今、あなたは例えば、最初の値456にアクセスするために、あなたがする必要があります...ゲッターとセッターを使用してresponseオブジェクト内

のすべてのデータにアクセスすることができます

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

私は取りますあなたがhttp://json.parser.online.fr/を提案したことの自由は、それはPOによって提供されたJsonの構文エラーを発見しました。 – giampaolo

+0

[link] [http://www.jsonschema2pojo.org]は、JSONレスポンスを取得してJavaオブジェクトを作成するのに本当に便利だと思います! –

8

何をしようとしているかによって異なります。あなたはjsonと一致するPOJO階層を設定することができ、here(推奨の方法)です。または、カスタムdeserializerを提供することもできます。問題のトリッキーな実装だと思ったので、私はidのデータしか扱っていませんでした。 gsonタイプを使用してjsonの手順を実行し、表示しようとしているデータを作成してください。 DataクラスとIdクラスは、文字列のプロパティで構成され、反映されたpojosです。

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 + '}'; 
    } 
} 
関連する問題