É possível: ter um campo na classe, mas nomes diferentes para ele durante a serialização / desserialização na biblioteca Jackson?
Por exemplo, eu tenho a classe "Coordiantes".
class Coordinates{
int red;
}
Para desserialização do JSON, queira ter um formato como este:
{
"red":12
}
Mas quando eu serializar o objeto, o resultado deve ser como este:
{
"r":12
}
Tentei implementar isso aplicando a @JsonProperty
anotação no getter e no setter (com valores diferentes):
class Coordiantes{
int red;
@JsonProperty("r")
public byte getRed() {
return red;
}
@JsonProperty("red")
public void setRed(byte red) {
this.red = red;
}
}
mas eu tenho uma exceção:
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: campo não reconhecido "vermelho"
Você pode usar o
@jsonAlias
que foi introduzido no jackson 2.9.0Exemplo:
Isso é usado
r
durante a serialização, mas permitered
um alias durante a desserialização. Isso ainda permiter
ser desserializado também.fonte
has no effect during serialization where primary name is always used
. Não é isso que o OP quer.r
como nome principal, masred
para o@JsonAlias
, o que permite serializá-lor
, mas acrescentared
a ser reconhecido na desserialização. Anotá-lo com@JsonProperty("r")
e adicionalmente@JsonAlias("red")
deve funcionar bem para o problema em questão.Você pode usar uma combinação de @JsonSetter e @JsonGetter para controlar a desserialização e serialização de sua propriedade, respectivamente. Isso também permitirá que você mantenha nomes padronizados de métodos getter e setter que correspondem ao seu nome de campo real.
fonte
Eu ligaria dois pares diferentes de getters / setters a uma variável:
fonte
É possível ter um par getter / setter normal. Você só precisa especificar o modo de acesso em
@JsonProperty
Aqui está o teste de unidade para isso:
Eu obtive a saída da seguinte maneira:
fonte
Não era isso que eu esperava como solução (embora seja um caso de uso legítimo). Meu requisito era permitir que um cliente com bugs existente (um aplicativo móvel que já foi lançado) usasse nomes alternativos.
A solução está em fornecer um método de incubação separado como este:
fonte
Eu sei que é uma pergunta antiga, mas para mim eu a fiz funcionar quando descobri que ela está em conflito com a biblioteca Gson; portanto, se você estiver usando o Gson, use em
@SerializedName("name")
vez de@JsonProperty("name")
esperar que isso ajudefonte
Anotar com o
@JsonAlias
que foi introduzido com Jackson 2.9+, sem mencionar@JsonProperty
o item a ser desserializado com mais de um alias (nomes diferentes para uma propriedade json) funciona bem.Eu usei
com.fasterxml.jackson.annotation.JsonAlias
a consistência do pacotecom.fasterxml.jackson.databind.ObjectMapper
no meu caso de uso.Por exemplo:
apenas funciona bem.
fonte
Eles devem ter incluído isso como um recurso, porque agora definir um diferente
@JsonProperty
para um getter e setter resulta exatamente no que você esperaria (nome de propriedade diferente durante a serialização e desserialização para o mesmo campo). Jackson versão 2.6.7fonte
Você pode escrever uma classe serializada para fazer isso:
fonte