2013-10-03 14 views
17

Ich versuche, einige JSON-Daten mit Hilfe von gson in Java zu analysieren, die die folgende Struktur haben, aber indem ich Beispiele online betrachte, kann ich nichts finden, das den Job erledigt.Geschachtelte JSON-Daten mit GSON analysieren

Würde jemand helfen können?

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

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

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

Antwort

39

Sie müssen nur eine Java-Klassenstruktur erstellen, die die Daten in Ihrem JSON darstellt. Um das zu tun, schlage ich vor, Sie JSON in diesem online JSON Viewer zu kopieren, und Sie werden die Struktur Ihrer JSON viel klarer ...

Grundsätzlich müssen Sie diese Klassen (Pseudo-Code) sehen:

class Response 
    Data data 

class Data 
    List<ID> id 

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

Beachten Sie, dass Attributnamen in Ihren Klassen den Namen Ihrer JSON-Felder entsprechen müssen! Sie können weitere Attribute und Klassen entsprechend Ihrer tatsächlichen JSON-Struktur hinzufügen ... Beachten Sie auch, dass Sie Getter und Setter für alle Ihre Attribute benötigen!

Schließlich müssen Sie nur mit der JSON in Ihre Java-Klassenstruktur analysieren:

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

Und das ist es! Jetzt können Sie alle Ihre Daten innerhalb des response Objekt Zugriff auf die Getter und Setter ...

Zum Beispiel verwenden, um 456 den ersten Wert zuzugreifen, werden Sie tun müssen:

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

Ich nehme die Freiheit, Ihnen http://json.parser.online.fr/ vorzuschlagen, entdeckte auch einen Syntaxfehler auf Json, der von PO bereitgestellt wurde. – giampaolo

+0

Ich denke, [link] [http://www.jsonschema2pojo.org] ist wirklich nützlich, um eine JSON-Antwort zu nehmen und Java-Objekte für Sie zu erstellen! –

8

Je nachdem, was Sie versuchen zu tun. Sie könnten einfach eine POJO-Hierarchie einrichten, die zu Ihrer jsonhere (Bevorzugte Methode) passt. Oder Sie können eine benutzerdefinierte deserializer bereitstellen. Ich habe mich nur mit den id Daten beschäftigt, da ich annahm, dass es sich um die knifflige Implementierung handelte. Gehen Sie einfach durch die json mit den gson Typen und erstellen Sie die Daten, die Sie darstellen möchten. Die und Id Klassen sind nur pojos zusammengesetzt und reflektieren die Eigenschaften in der ursprünglichen json Zeichenfolge.

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:

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

Ergebnis:

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 + '}'; 
    } 
} 
Verwandte Themen