2016-04-07 10 views
3

Ich muss eine JSON-Zeichenfolge analysieren, die Objekte enthält, aber es kann auch Arrays im JSON geben, die ich nicht benötige und die momentan abstürzen:Verwenden von Gson zum Analysieren von JSON mit Objekten, aber zum Ausschließen von Arrays

com.google.gson.JsonSyntaxException: 
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY 

Wenn ich alle Arrays aus dem JSON entfernen, funktioniert es völlig in Ordnung, die JSON mit meinem POJO mit dem folgenden Code zu analysieren:

Type type = new TypeToken<Map<String, UsersPOJO>>(){}.getType(); 
Map<String, UsersPOJO> myUsers = gson.fromJson(JSONString, type); 

Aber ich habe kein Parsing Glück, wenn es Arrays im JSON. Ich brauche nicht, noch möchte ich die Arrays analysieren, aber wenn es notwendig ist, würde das Analysieren der Arrays und das anschließende Verwerfen des Ergebnisses in Ordnung sein.

Wie erreiche ich das mit Gson? Oder irgendeine andere Java JSON-Bibliothek für diese Angelegenheit. Gson ist keine Anforderung.

Dies ist ein Beispiel für die JSON ich Parsen würde:

{ 
    "1002001":{ 
     "level":2, 
     "name":"CaptKrunch", 
     "uid":1002001, 
     "user":{ 
     "age":21, 
     "city":"None", 
     "country":"United States", 
     "creation":1269969663 
     }, 
     "meta":{ 
     "score":1762, 
     "rank":78 
     } 
    }, 
    "1003001":{ 
     "level":11, 
     "name":"LtRaine", 
     "uid":1003001, 
     "user":{ 
     "age":35, 
     "city":"LA", 
     "country":"United States", 
     "creation":1269369663 
     }, 
     "meta":{ 
     "score":11562, 
     "rank":11 
     } 
    }, 
    "tags_1002001": [ 
    "conqurer", 
    "almighty" 
    ] 
} 
+0

Das Problem hier ist, dass Ihre JSON-Daten nicht einheitlich sind. Dies sollte auf der Seite des Datenproviders und nicht im Parsing-Code behoben werden. Angenommen, Sie könnten den JSON vorverarbeiten, müssten Sie die Elemente der obersten Ebene entfernen, die unerwartete Daten enthalten (auch bekannt als die Arrays) – Vogel612

+0

@ Vogel612 Die Generierung der JSON-Daten kann ich nicht steuern. Ich wurde beauftragt, es für eine Client-App zu analysieren und kann nichts auf der Serverseite ändern, fürchte ich. Dies wäre kein Problem zu analysieren, wenn ich C# verwenden könnte, aber leider ist Java erforderlich. Kann das nicht in Java mit den aktuell verfügbaren Json-Bibliotheken gemacht werden? – kaderud

+0

Hier was du alles entfernen oder ignorieren willst ??? –

Antwort

1

Sie Array überspringen können, wenn Parse JSON-String zu JsonElement und alle Elemente iterieren:

Gson gson = new Gson(); 

//Type type = new TypeToken<Map<String, UsersPOJO>>(){}.getType(); 
//Map<String, UsersPOJO> myUsers = gson.fromJson(jsonString, type); 

JsonParser parser = new JsonParser(); 
JsonElement topElement = parser.parse(jsonString); 
Map<String, UsersPOJO> myUsers = new HashMap<>(); 
for (Map.Entry<String, JsonElement> entry : topElement.getAsJsonObject().entrySet()) { 
    if (entry.getValue().isJsonArray()) { 
     //skip or process array 
    } else { 
     myUsers.put(entry.getKey(), gson.fromJson(entry.getValue(), UsersPOJO.class)); 
    } 
} 
+0

das ist genau das, was ich gesucht habe! Ich war in der Verarbeitung von etwas ähnliches mit entry.getValue/getKey, aber rekonstruieren eine neue JSON-String! :-) Aber diese Lösung ist ** genau ** wonach ich gesucht habe! – kaderud

+0

Kopfgeld wird in 15 Stunden vergeben, das ist die früheste SO wird mich lassen! :-) Vielen Dank! – kaderud

Verwandte Themen