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 classe Adapter<T>
de read(JsonReader in)
la méthode.
Solution:
Vous pouvez écrire une coutume TypeAdapter qui poignées name
, person
et les user
balises JSON et les cartes à champ nom de votre classe personnalisée MyClass
:
class MyClassTypeAdapter extends TypeAdapter<MyClass> {
@Override
public MyClass read(final JsonReader in) throws IOException {
final MyClass myClassInstance = new MyClass();
in.beginObject();
while (in.hasNext()) {
String jsonTag = in.nextName();
if ("id".equals(jsonTag)) {
myClassInstance.id = in.nextInt();
} else if ("name".equals(jsonTag)
|| "person".equals(jsonTag)
|| "user".equals(jsonTag)) {
myClassInstance.name = in.nextString();
}
}
in.endObject();
return myClassInstance;
}
@Override
public void write(final JsonWriter out, final MyClass myClassInstance)
throws IOException {
out.beginObject();
out.name("id").value(myClassInstance.id);
out.name("name").value(myClassInstance.name);
out.endObject();
}
}
Cas de test:
String jsonVal0 = "{\"id\": 5382, \"user\": \"Mary\" }";
String jsonVal1 = "{\"id\": 2341, \"person\": \"Bob\"}";
final GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(MyClass.class, new MyClassTypeAdapter());
final Gson gson = gsonBuilder.create();
MyClass myClassInstance0 = gson.fromJson(jsonVal0, MyClass.class);
MyClass myClassInstance1 = gson.fromJson(jsonVal1, MyClass.class);
System.out.println("jsonVal0 :" + gson.toJson(myClassInstance0));
// output: jsonVal0 :{"id":5382,"name":"Mary"}
System.out.println("jsonVal1 :" + gson.toJson(myClassInstance1));
// output: jsonVal1 :{"id":2341,"name":"Bob"}
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.)
public abstract String [] Alternate
Renvoie: les noms alternatifs du champ lorsqu'il est désérialisé
Par défaut: {}