Gson, JSON und die Feinheiten von LinkedTreeMap

7

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:

%Vor%

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;

%Vor%

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 ?

aus     
ViRALiC 09.03.2014, 17:44
quelle

5 Antworten

24

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)

%Vor%

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.

%Vor%

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

werfen %Vor%

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.

    
Sotirios Delimanolis 09.03.2014, 17:54
quelle
4

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:

%Vor%

Jetzt können Sie name von user

erhalten %Vor%     
AKS 09.03.2014 17:54
quelle
2

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

    
sagits 06.12.2015 20:10
quelle
1

user ist ein JsonObject selbst:

%Vor%     
Smutje 09.03.2014 17:54
quelle
0

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.

    
Mikkel Løkke 09.03.2014 18:38
quelle

Tags und Links