Existe alguma maneira no Gson de mapear vários campos JSON para uma única variável de membro de objeto Java?
Digamos que eu tenha uma classe Java ...
public class MyClass {
String id;
String name;
}
Desejo usar esta única classe com dois serviços diferentes. No entanto, esses dois serviços diferem na forma como eles retornam seus dados ...
{ "id": 2341, "person": "Bob" }
... e ...
{ "id": 5382, "user": "Mary" }
... respectivamente.
Existe alguma maneira de mapear os campos "person"
e "user"
na string JSON para o name
campo no objeto Java?
(Observação: eu só preciso converter de string JSON para objeto Java - nunca o contrário.)
Respostas:
Em outubro de 2015, Gson versão 2.4 ( changelog ) adicionou a capacidade de usar nomes alternativos / múltiplos para
@SerializedName
ao desserializar. Não é mais necessário um TypeAdapter personalizado!Uso:
https://www.javadoc.io/doc/com.google.code.gson/gson/2.6.2/com/google/gson/annotations/SerializedName.html
fonte
Não há suporte para definir várias
@SerializedName
anotações para um campo no Gson.Motivo: por padrão, a desserialização é gerenciada com um LinkedHashMap e as chaves são definidas pelos nomes de campo json de entrada (não os nomes de campo da classe personalizada ou serializedNames) e há um mapeamento um para um. Você pode ver a implementação (como funciona a desserialização) na
ReflectiveTypeAdapterFactory
classe interna da classeAdapter<T>
'sread(JsonReader in)
método.Solução: Você pode escrever um personalizado TypeAdapter que alças
name
,person
euser
tags de JSON e mapas-los para o campo nome da sua classe personalizadaMyClass
:Caso de teste:
Exemplos sobre TypeAdapters.
Editar 2016.04.06: Como @Mathieu Castets escreveu em sua resposta, agora é compatível. (Essa é a resposta correta para esta pergunta.)
fonte
para fãs de Kotlin
fonte
Para KOTLIN eu usei abaixo, mas não funciona
então eu editei e aqui funciona bem !!
fonte