2013-05-16 7 views
20

Ich habe die folgenden JSON und ich bin nur daran interessiert, die Elemente "status", "lat" und "lng" zu bekommen.GSON Parsing ohne viele Klassen

Verwenden Gson, ist es möglich, dieses JSON zu analysieren, um diese Werte zu erhalten, ohne die gesamte Klassenstruktur zu erstellen, die den JSON-Inhalt darstellt?

JSON:

{ 
    "result": { 
    "geometry": { 
     "location": { 
     "lat": 45.80355369999999, 
     "lng": 15.9363229 
     } 
    } 
    }, 
    "status": "OK" 
} 
+2

Ihr JSON ist ungültig (Sie können es mit [jsonlint] (http://jsonlint.com) überprüfen. Die innere 'geometry' Eigenschaft von' address_components' sollte in ein Objekt eingeschlossen werden (mit Klammern '{}') – Perception

+0

Ich habe eine Menge unnötiger Knoten abgeschnitten und ein Tippfehler ist aufgetreten :-) – Reeebuuk

+0

Also, was ist das richtige Formular? Kann nicht wirklich eine schnelle Lösung vorschlagen, ohne das zu wissen. – Perception

Antwort

32

Sie müssen keine neuen Klassen definieren, Sie können einfach den JSON verwenden Objekte, die mit der Gson-Bibliothek geliefert werden. Hier ein einfaches Beispiel:

JsonParser parser = new JsonParser(); 
JsonObject rootObj = parser.parse(json).getAsJsonObject(); 
JsonObject locObj = rootObj.getAsJsonObject("result") 
    .getAsJsonObject("geometry").getAsJsonObject("location"); 

String status = rootObj.get("status").getAsString(); 
String lat = locObj.get("lat").getAsString(); 
String lng = locObj.get("lng").getAsString(); 

System.out.printf("Status: %s, Latitude: %s, Longitude: %s\n", status, 
     lat, lng); 

Einfach und einfach. Wenn Sie feststellen, dass Sie denselben Code immer wieder wiederholen, können Sie Klassen erstellen, um das Mapping zu vereinfachen und Wiederholungen zu vermeiden.

+0

Gute Lösung ohne einen benutzerdefinierten Deserializer! Jedenfalls denke ich, dass dieser Ansatz viel schwieriger zu pflegen und wiederzuverwenden ist ... denkst du nicht, dass es besser und eleganter ist, das übliche Parsing mit Klassen zu verwenden? – MikO

+0

Gibt es einen Leistungsunterschied zwischen Ihrer und der MikOs Lösung? – Reeebuuk

+1

Für solch kleine Eingabedaten wird die Leistungsverbesserung vernachlässigbar sein. Bei größeren Datensätzen wird beim Verwalten des (extra) gemappten POJO Zeit gespart. Denken Sie jedoch daran, dass die Verwendung einer Methode gegenüber der anderen viel stärker sein sollte als jede wahrgenommene Leistungssteigerung (beispielsweise kann die Erstellung einer Mapping-Klasse aufgrund der Komplexität der eingehenden Daten unnötig langwierig sein). – Perception

5

Es ist in der Tat möglich, aber Sie haben ein benutzerdefinierten Deserializer erstellen. Weitere Informationen finden Sie in der Gson-Dokumentation here und der Gson API Javadoc here. Und sehen Sie sich auch andere Antworten von mir an here und here ... und wenn Sie noch Zweifel haben, kommentieren Sie.

Meiner Meinung nach ist es viel einfacher für Sie, es zu analysieren, indem Sie die Korrespondenzklassen erstellen, noch mehr unter Berücksichtigung der Einfachheit Ihrer JSON-Antwort ... Mit dem üblichen Ansatz müssen Sie nur ein paar super- einfache Klassen, aber schreibe einen benutzerdefinierten Deserializer, obwohl ist nicht so komplex, dauert es wahrscheinlich länger, und es wird schwieriger zu adaptieren, wenn Sie später noch einige Daten von Ihrem JSON benötigen ...

Gson hat eine Art zu funktionieren, die für Entwickler entwickelt wurde, um es zu verwenden, nicht um zu versuchen, Workarounds zu finden!

Wie auch immer, warum möchten Sie keine Klassen verwenden? Wenn Sie nicht viele Klassen in Ihrem Projekt haben möchten, können Sie einfach verschachtelte Klassen verwenden und Ihr Projekt wird sauberer aussehen ...

+0

Wenn du es so sagst, stimme ich dir zu. Ich werde versuchen, alle Klassen zu generieren und hier zu antworten, es wird einige Probleme geben. – Reeebuuk

+0

Just deserialize stattdessen JsonObject, in Ihrem Fall ist es das, was Sie suchen – eugen

+0

Fertig, machte ein paar verschachtelte klassifiziert und alles funktioniert gut. Thx an alle :-) – Reeebuuk