Gson JSON und die Feinheiten der LinkedTreeMap
Ich habe vor kurzem angefangen zu spielen, um mit JSON
Saiten, und mir wurde gesagt, dass die Google-eigenen Bibliothek Gson
ist die neue und hippe Art und Weise des Umgangs mit diesen.
Die Art, wie ich das verstanden hab, ist, dass ein JSON
string ist im wesentlichen eine Karte. Wo jede variable Punkte auf einen Wert in der Zeichenfolge.
Beispiel:
String jsonInput2 = "{\"created_at\":\"Sat Feb 08 15:37:37 +0000 2014\",\"id\":432176397474623489\"}
So weit, alles ist gut. Informationen wie, wenn diese JSON
Zeichenfolge erstellt wurde, kann einer Variablen zugewiesen werden, mit dem folgenden code:
Gson gson = new Gson();
Map<String, String> map = new HashMap<String, String>();
map = (Map<String, String>) gson.fromJson(jsonInput, map.getClass());
String createdAt = map.get("created_at");
Es ist fast künstlerischen, in schlichter Schönheit. Aber dies ist, wo die Schönheit endet und meine Verwirrung beginnt.
Folgende ist eine Erweiterung der oben genannten JSON
string;
String jsonInput2 = "{\"created_at\":\"Sat Feb 08 15:37:37 +0000 2014\",\"id\":432176397474623489\",\"user\":{\"id_str\":\"366301747\",\"name\":\"somethingClever\",\"screen_name\":\"somethingCoolAndClever\"}}";
Meine Frage ist, wie diese "Klammern innerhalb von Klammern" arbeiten für die user
Abschnitt der JSON
?
Wie könnte ich weisen Sie die Werte angegeben, die innerhalb dieser inneren Klammern um die Variablen?
Kann jemand mir erklären, oder mir zeigen, in code, wie Gson
Griffe Sachen wie diese, und wie kann ich es nutzen?
Kurz, warum...
String jsonInput = "{\"created_at\":\"Sat Feb 08 15:37:37 +0000 2014\",\"id\":432176397474623489\",\"user\":{\"id_str\":\"366301747\",\"name\":\"somethingClever\",\"screen_name\":\"somethingCoolAndClever\"}}";
Gson gson = new Gson();
Map<String, String> map = new HashMap<String, String>();
map = (Map<String, String>) gson.fromJson(jsonInput, map.getClass());
String name = map.get("name");
System.out.println(name);
... drucken Sie null
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vergessen Sie Java. Sie müssen zuerst verstehen, die JSON-format. Dies ist grundsätzlich
Ihre zweite JSON
String
(die eine fehlende"
), ist die folgende (verwenden Sie jsonlint.com format)JSON ist ein Objekt, äußere
{}
enthält drei Paaren, diecreated_at
was ist ein JSON-string,id
das ist auch ein JSON-string, unduser
was ist ein JSON-Objekt. Das JSON-Objekt enthält drei weitere Paare, die alle JSON-strings.Fragte Sie
Modernsten JSON-parsing/Generierung von Bibliotheken gemeint sind, zu konvertieren, JSON, Pojos und zurück.
So konnte Sie Ihre Karte JSON-format auf Java-Klassen.
Hinweis: die
@SerializedName
, so dass Sie halten können mit Java-Namenskonventionen für Ihre Felder.Können Sie jetzt Deserialisieren Ihre JSON -
drucken würde
zeigen, dass Sie alle Felder korrekt eingestellt waren.
Den source-code von Gson ist frei verfügbar. Sie finden es online. Es ist Komplex, und eine source-code-Erklärung wäre nicht hier passen. Einfach ausgedrückt, es nutzt die
Class
Objekt, das Sie bieten, um zu bestimmen, wie es anzeigen die JSON-Paare. Es sieht an der entsprechenden Klasse Felder. Wenn diese Felder sind in anderen Klassen, dann wird es wiederholt, bis es gebaut hat eine Karte für alles, was es braucht, zu Deserialisieren.Weil Ihre Wurzel JSON-Objekt, nicht ein paar, die mit Namen
name
. Anstelle der Verwendung vonMap
verwenden Gson istJsonObject
geben.dem Drucke
Der oben beschriebenen Methode der Klasse haben könnte geworfen, eine Reihe von Ausnahmen, die, wenn Sie nicht den richtigen Typ. Wenn, zum Beispiel, wir getan hatten,
würde es scheitern, weil
user
ist nicht ein JSON-array. Speziell, es würde werfenAlso die
JsonElement
Klasse (das ist die übergeordnete Klasse derJsonObject
,JsonArray
, und ein paar andere) bietet Methoden, um zu überprüfen, was es ist. Finden Sie in der javadoc.Für die Menschen, die hierher kommen, suchen einen Weg zu konvertieren LinkedTreeMap zum Objekt:
Dies war nützlich für mich, wenn ich brauchte, um zu analysieren, ein generisches Objekt wie:
Aber ich weiß nicht, welches Objekt den server senden wollte. Die objectFull wird ein LinkedTreeMap
Den JSON-string hat folgenden Aufbau:
Wenn Sie die Werte in die map mit dem code:
Es hat die folgenden wichtigen Werte:
und das ist, warum Sie in der Lage sind zu verwenden
map.get("created_at")
.Nun, da Sie wollen, um den Namen des Benutzers zu erhalten, müssen Sie die Karte von user:
In der
userMap
erhalten Sie folgende wichtige Werte:Nun können Sie sich die
name
desuser
gson.fromJson(map.get("user")
fehl.map.getUser("user")
gibt eineLinkedTreeMap
.user
ist einJsonObject
selbst:map
erklärt wirdMap<String, String>
.LinkedTreeMap
. Gson nicht kennenJsonObject
es sei denn, Sie sagen es.Ok. Zunächst ist JSON, kurz für "JavaScript Objekt Notation", so Ihre Behauptung, "dass ein JSON-string ist im wesentlichen eine Karte" ist falsch. Ein JSON-block ist ein Objekt-graph, beschrieben unter Verwendung der JavaScript-Sprache-syntax. Da Ihr versucht zu zwingen, ein Objektdiagramm, um eine Map von String -, Stich-kay-Wert-Paare, dies ist nur in Fällen, in denen alle angegebenen JSON-Objekt-graph ist im wesentlichen genau das (also nicht sehr oft). Eine weitere erfolgreiche Strategie würde wahrscheinlich
gson.fromJson()
das wird konvertieren Sie Ihre JSON zu einem richtigen Java-objektgraphen.