Ich habe kürzlich angefangen, mit JSON
strings herumzuspielen, und mir wurde gesagt, dass Googles eigene Bibliothek Gson
der neue und hippe Weg ist, mit diesen umzugehen.
So wie ich es verstanden habe, ist eine JSON
string im Wesentlichen eine Karte. Wo jede Variable auf einen Wert in der Zeichenfolge zeigt.
Zum Beispiel:
%Vor% Bis jetzt ist alles in Ordnung. Informationen wie zum Beispiel, wenn dieser JSON
-String erstellt wurde, können einer Variablen mit dem folgenden Code zugewiesen werden:
Es ist fast künstlerisch in einfacher Schönheit. Aber hier endet die Schönheit und meine Verwirrung beginnt.
Das Folgende ist eine Erweiterung der obigen JSON
string;
Meine Frage ist, wie diese "Klammern in Klammern" für den user
-Abschnitt von JSON
funktionieren?
Wie kann ich die in diesen inneren Klammern angegebenen Werte Variablen zuweisen?
Kann mir jemand erklären, oder zeigen Sie mir im Code, wie Gson
solche Sachen behandelt und wie ich sie verwenden kann?
Kurz gesagt, warum ...
%Vor% ... drucke null
?
Vergessen Sie Java. Sie müssen zuerst das JSON-Format verstehen. Das ist es im Grunde
%Vor% Ihre zweite JSON String
(die "
fehlt) ist die folgende (verwenden Sie jsonlint.com zum Formatieren)
Der JSON ist ein Objekt, outer {}
, das drei Paare enthält, created_at
ist ein JSON-String, id
ist ebenfalls ein JSON-String und user
ist ein JSON-Objekt. Dieses JSON-Objekt enthält drei weitere Paare, die alle JSON-Zeichenfolgen sind.
Sie haben gefragt
Wie kann ich die in diesen inneren Klammern angegebenen Werte zuweisen? Variablen?
Die meisten fortgeschrittenen JSON-Parsing / Generierungsbibliotheken sollen JSON in Pojos und zurück konvertieren.
So können Sie Ihr JSON-Format Java-Klassen zuordnen.
%Vor% Beachten Sie die @SerializedName
, damit Sie weiterhin Java-Namenskonventionen für Ihre Felder verwenden können.
Sie können Ihr JSON jetzt deserialisieren
%Vor%würde drucken
%Vor%zeigt an, dass alle Felder richtig gesetzt wurden.
Kann mir jemand erklären oder mir Code zeigen, wie Gson solche Sachen verarbeitet und wie ich sie verwenden kann?
Der Quellcode von Gson ist frei verfügbar. Sie können es online finden. Es ist komplex und eine Quelltext-Erklärung würde hier nicht passen. Einfach ausgedrückt, verwendet es das Class
-Objekt, das Sie angeben, um zu bestimmen, wie es die JSON-Paare abbildet. Es schaut sich die entsprechenden Klassenfelder an. Wenn es sich bei diesen Feldern um andere Klassen handelt, wird es wiederholt, bis eine Zuordnung aller für die Deserialisierung erforderlichen Elemente erstellt wurde.
Kurz gesagt, warum druckt ... null aus?
Weil Ihr Root-JSON-Objekt kein Paar mit dem Namen name
hat. Anstatt Map
zu verwenden, verwenden Sie den JsonObject
-Typ von Gson.
welches druckt
%Vor%Die obige Methodenklasse könnte eine Reihe von Ausnahmen ausgelöst haben, wenn sie nicht der richtige Typ waren. Wenn wir zum Beispiel
gemacht hätten %Vor% Es würde fehlschlagen, weil user
kein JSON-Array ist. Insbesondere würde es
Also die JsonElement
Klasse (die Elternklasse von JsonObject
, JsonArray
und einige andere) stellt Methoden zur Verfügung, um zu überprüfen, was es ist. Siehe das Javadoc.
Die JSON-Zeichenfolge hat folgende Struktur:
%Vor%Wenn Sie die Werte mithilfe des Codes in die Karte einfügen:
%Vor%Es hat folgende Schlüsselwerte:
%Vor% und deshalb können Sie map.get("created_at")
verwenden.
Jetzt, da Sie den Namen des Benutzers erhalten möchten, müssen Sie die Karte des Benutzers erhalten:
%Vor% In userMap
würden Sie folgende Schlüsselwerte erhalten:
Jetzt können Sie name
von user
Für Leute, die hierher kommen, um nach einer Möglichkeit zu suchen, LinkedTreeMap in ein Objekt umzuwandeln:
%Vor%Das war nützlich für mich, wenn ich ein generisches Objekt analysieren musste:
%Vor%Aber ich weiß nicht, welches Objekt der Server senden würde. Das ObjektFull wird zu einer LinkedTreeMap
Ok. Zunächst einmal ist JSON die Abkürzung für "JavaScript Object Notation", daher ist Ihre Behauptung, dass eine JSON-Zeichenfolge im Wesentlichen eine Karte ist, falsch. Ein JSON-Block ist ein Objektdiagramm, das mit der JavaScript-Syntax beschrieben wird. Da Sie versuchen, ein Objektdiagramm auf eine Karte von String-, Stichproben-Wertpaaren anzuwenden, wird dies nur in Fällen funktionieren, in denen ein gegebenes JSON-Objektdiagramm im Wesentlichen nur das ist (so nicht sehr oft). Eine erfolgreichere Strategie wäre wahrscheinlich gson.fromJson()
, die Ihren JSON in ein korrektes Java-Objektdiagramm konvertiert.