Existe-t-il un moyen dans Gson de mapper plusieurs champs JSON à une seule variable membre d'objet Java?
Disons que j'ai une classe Java ...
public class MyClass {
String id;
String name;
}
Je souhaite utiliser cette classe unique avec deux services différents. Cependant, ces deux services diffèrent dans la manière dont ils retournent leurs données ...
{ "id": 2341, "person": "Bob" }
... et ...
{ "id": 5382, "user": "Mary" }
... respectivement.
Existe-t-il un moyen de mapper à la fois les champs "person"
et "user"
de la chaîne JSON avec le name
champ de l'objet Java?
(Remarque: je n'ai besoin que de convertir une chaîne JSON en objet Java - jamais l'inverse.)
Réponses:
En octobre 2015, Gson version 2.4 ( changelog ) a ajouté la possibilité d'utiliser des noms alternatifs / multiples
@SerializedName
lors de la désérialisation. Plus besoin d'adapter TypeAdapter personnalisé!Usage:
https://www.javadoc.io/doc/com.google.code.gson/gson/2.6.2/com/google/gson/annotations/SerializedName.html
la source
Il n'est pas pris en charge de définir plusieurs
@SerializedName
annotations à un champ chez Gson.Raison: Par défaut, la désérialisation est gérée avec un LinkedHashMap et les clés sont définies par les noms de champ de json entrants (pas les noms de champ de la classe personnalisée ou les serializedNames) et il existe un mappage un à un. Vous pouvez voir la mise en œuvre (comment les travaux de désérialisation) à la
ReflectiveTypeAdapterFactory
classe interne de la classeAdapter<T>
deread(JsonReader in)
la méthode.Solution: Vous pouvez écrire une coutume TypeAdapter qui poignées
name
,person
et lesuser
balises JSON et les cartes à champ nom de votre classe personnaliséeMyClass
:Cas de test:
Exemples sur TypeAdapters.
Edit 2016.04.06: Comme @Mathieu Castets l'a écrit à sa réponse, elle est supportée maintenant. (C'est la bonne réponse à cette question.)
la source
pour les fans de Kotlin
la source
Pour KOTLIN, j'ai utilisé ci-dessous mais ne fonctionne pas
donc je l'ai édité et ici ça marche bien !!
la source