¿Hay alguna forma en Gson de mapear múltiples campos JSON a una sola variable miembro de objeto Java?
Digamos que tengo una clase de Java ...
public class MyClass {
String id;
String name;
}
Quiero usar esta clase única con dos servicios diferentes. Sin embargo, estos dos servicios difieren en cómo devuelven sus datos ...
{ "id": 2341, "person": "Bob" }
... y ...
{ "id": 5382, "user": "Mary" }
... respectivamente.
¿Hay alguna forma de asignar los campos "person"
y "user"
en la cadena JSON al name
campo en el objeto Java?
(Nota: solo necesito convertir de una cadena JSON a un objeto Java, nunca al revés).
Respuestas:
En octubre de 2015, la versión 2.4 de Gson ( registro de cambios ) agregó la capacidad de usar nombres alternativos / múltiples para la
@SerializedName
deserialización. ¡No se necesitan más adaptadores de tipos personalizados!Uso:
https://www.javadoc.io/doc/com.google.code.gson/gson/2.6.2/com/google/gson/annotations/SerializedName.html
fuente
No se admite definir múltiples
@SerializedName
anotaciones en un campo en Gson.Motivo: De forma predeterminada, la deserialización se administra con un LinkedHashMap y las claves se definen por los nombres de campo de json entrantes (no los nombres de campo de la clase personalizada o los serializedNames) y hay una asignación uno a uno. Se puede ver la aplicación (cómo funciona la deserialización) en la
ReflectiveTypeAdapterFactory
clase interna de la claseAdapter<T>
'sread(JsonReader in)
método.Solución: Se puede escribir una costumbre TypeAdapter que maneja
name
,person
yuser
etiquetas JSON y los asigna a campo del nombre de la clase personalizadaMyClass
:Caso de prueba:
Ejemplos sobre TypeAdapters.
Editar 2016.04.06: Como ha escrito @Mathieu Castets en su respuesta, ahora es compatible. (Esa es la respuesta correcta para esta pregunta).
fuente
para los fans de Kotlin
fuente
Para KOTLIN utilicé a continuación pero no funciona
¡¡Así que lo edité y aquí funciona bien !!
fuente