GSON konvertiert zu LinkedHashMap anstelle meines Objekts

9

Ich habe diesen Codeschnipsel:

%Vor%

Wenn ich versuche, foreach zu machen, ist mein Entities-Objekt nicht länger vom Typ Entity, sondern LinkedHashMap, und ich erhalte diese Ausnahme: java.lang.ClassCastException: java.util.LinkedHashMap kann nicht in com.tranca.bookstore.domain umgewandelt werden. shared.BaseObject

Hier ist die JSONObject-Klasse (von mir erstellt)

%Vor%

}

Vielleicht ist das Basisobjekt relevant, daher werde ich den Code hier einfügen:

%Vor%     
Daniel Tranca 08.04.2012, 23:37
quelle

2 Antworten

3

Ich hatte das gleiche / ein ähnliches Problem. Um eine klarere Antwort in einem etwas anderen Kontext zu geben:

Ich hatte folgende Methode, die den Fehler "com.google.gson.internal.LinkedTreeMap konnte nicht in MyType umgewandelt werden":

%Vor%

Ich wollte eine einfache generische Methode zum Lesen / Schreiben von verknüpften Hashmaps. Die obige Lösung funktioniert nicht, da die Typinformationen des TypeToken mit TKey und TValue nach der Kompilierung verloren gehen, soweit ich weiß. Und das ist das Problem. Wenn Sie Ihren Code in das folgende Beispiel ändern, funktioniert es, weil wir jetzt explizit den Typ-Token definieren. Ich bin nicht so sehr in Java, dass ich verstehe, warum in diesem Fall ist es möglich, die Typinformationen zur Laufzeit zu lesen.

%Vor%

Und nun würden Sie die obige Funktion wie folgt aufrufen:

%Vor%

A sidnote 1: Wenn Sie die verknüpfte Hash-Map schreiben, müssen Sie überhaupt keinen Typ-Token angeben. ToJson (Karte) ist ausreichend.

A sidenote 2 (zu einem Problem, das ich hatte): Standardmäßig verwendet gson toString (), um den Schlüssel zu serialisieren. Wenn Sie einen Typadapter für den Schlüsseltyp registrieren, der möglicherweise ein komplexerer Typ ist, wird dieser Typadapter beim Serialisieren, aber beim Deserialisieren nicht angewendet. Dies führt zu einem nicht konsistenten und daher fehlerhaften Prozess. Mit den folgenden Optionen aktivieren Sie die komplexe Kartenschlüsselserialisierung .

%Vor%     
Diego Frehner 06.11.2015 07:40
quelle
1

Endlich verstanden!

Das Problem war das:

  

neuer TypeToken & lt; JSON-Objekt & lt; Entität & gt; & gt; () {}. GetType ();

gibt den Typ von JSONObject & lt; T & gt; nicht die spezifische Entität der Unterklasse, die das Repository erweitert hat (z. B. erweitert UserRepository das Repository & lt; Benutzer & gt;).

Der Trick bestand darin, eine abstrakte Methode zu erstellen, um die Unterklassen zum Festlegen des Typs für die Deserialisierung zu zwingen.

Zusammenfassend, wenn Sie diesen Fehler erhalten, stellen Sie sicher, dass Sie den richtigen Typ der Klasse haben (falls Sie Unterklassen verwenden, stellen Sie sicher, dass sie den Typ Ihrer Unterklasse und nicht der Oberklasse zurückgibt).

    
Daniel Tranca 09.04.2012 21:33
quelle

Tags und Links