Gibt es in Gson eine Möglichkeit, mehrere JSON-Felder einer einzelnen Java-Objektmitgliedsvariablen zuzuordnen?
Angenommen, ich habe eine Java-Klasse ...
public class MyClass {
String id;
String name;
}
Ich möchte diese einzelne Klasse mit zwei verschiedenen Diensten verwenden. Diese beiden Dienste unterscheiden sich jedoch darin, wie sie ihre Daten zurückgeben ...
{ "id": 2341, "person": "Bob" }
... und ...
{ "id": 5382, "user": "Mary" }
... beziehungsweise.
Gibt es eine Möglichkeit, die Felder "person"
und "user"
in der JSON-Zeichenfolge dem name
Feld im Java-Objekt zuzuordnen ?
(Hinweis: Ich muss immer nur von einer JSON-Zeichenfolge in ein Java-Objekt konvertieren - niemals umgekehrt.)
Antworten:
Im Oktober 2015 hat Gson Version 2.4 ( Changelog ) die Möglichkeit hinzugefügt,
@SerializedName
beim Deserialisieren alternative / mehrere Namen zu verwenden . Kein benutzerdefinierter TypeAdapter mehr erforderlich!Verwendung:
https://www.javadoc.io/doc/com.google.code.gson/gson/2.6.2/com/google/gson/annotations/SerializedName.html
quelle
Es wird nicht unterstützt, mehrere
@SerializedName
Anmerkungen zu einem Feld bei Gson zu definieren .Grund: Standardmäßig wird die Deserialisierung mit einer LinkedHashMap verwaltet und die Schlüssel werden durch eingehende Feldnamen von json definiert (nicht durch die Feldnamen der benutzerdefinierten Klasse oder die serialisierten Namen), und es gibt eine Eins-zu-Eins-Zuordnung. Sie können die Implementierung (wie Deserialisierung Werke) bei siehe
ReflectiveTypeAdapterFactory
Klasse innere KlasseAdapter<T>
‚s -read(JsonReader in)
Methode.Lösung: Sie können eine benutzerdefinierte schreiben TypeAdapter welche Griffe
name
,person
unduser
json - Tags und ordnet sie der benutzerdefinierten Klasse NamensfeldMyClass
:Testfall:
Beispiele zu TypeAdapters.
Edit 2016.04.06: Wie @Mathieu Castets bei seiner Antwort geschrieben hat, wird es jetzt unterstützt. (Das ist die richtige Antwort auf diese Frage.)
quelle
für Kotlin Fans
quelle
Für KOTLIN habe ich unten verwendet, aber es funktioniert nicht
Also habe ich es bearbeitet und hier funktioniert es gut !!
quelle