¿Es posible: tener un campo en clase, pero diferentes nombres para él durante la serialización / deserialización en la biblioteca de Jackson?
Por ejemplo, tengo la clase "Coordiantes".
class Coordinates{
int red;
}
Para la deserialización de JSON, quiero tener un formato como este:
{
"red":12
}
Pero cuando serialice el objeto, el resultado debería ser como este:
{
"r":12
}
Intenté implementar esto aplicando @JsonPropertyanotaciones tanto en getter como en setter (con diferentes valores):
class Coordiantes{
int red;
@JsonProperty("r")
public byte getRed() {
return red;
}
@JsonProperty("red")
public void setRed(byte red) {
this.red = red;
}
}
pero tengo una excepción:
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: campo "rojo" no reconocido

Puede usar el
@jsonAliasque se introdujo en jackson 2.9.0Ejemplo:
Esto se usa
rdurante la serialización, pero permiteredcomo un alias durante la deserialización. Sin embargo, esto también permiterser deserializado.fuente
has no effect during serialization where primary name is always used. Esto no es lo que quiere el OP.rcomo nombre principal, peroredpara el@JsonAlias, que permite serializarlor, pero agregaredser reconocido en la deserialización. Anotarlo@JsonProperty("r")y, además,@JsonAlias("red")debería funcionar bien para el problema dado.Puede usar una combinación de @JsonSetter y @JsonGetter para controlar la deserialización y la serialización de su propiedad, respectivamente. Esto también le permitirá mantener los nombres estandarizados de los métodos getter y setter que corresponden a su nombre de campo real.
fuente
Me gustaría vincular dos pares getters / setters diferentes a una variable:
fuente
@JsonGettery@JsonSetter. Entonces, uno puede establecer exactamente cómo se comportará el serializador.Es posible tener un par getter / setter normal. Solo necesita especificar el modo de acceso en
@JsonPropertyAquí hay una prueba unitaria para eso:
Obtuve el resultado de la siguiente manera:
fuente
Esto no era lo que esperaba como solución (aunque es un caso de uso legítimo). Mi requisito era permitir que un cliente con errores existente (una aplicación móvil que ya se lanzó) usara nombres alternativos.
La solución radica en proporcionar un método de establecimiento separado como este:
fuente
Sé que es una vieja pregunta, pero para mí lo hice funcionar cuando descubrí que está en conflicto con la biblioteca Gson, así que si está usando Gson, use en
@SerializedName("name")lugar de@JsonProperty("name")esperar que esto ayudefuente
La anotación con la
@JsonAliasque se introdujo con Jackson 2.9+, sin mencionar@JsonPropertyel elemento que se deserializará con más de un alias (nombres diferentes para una propiedad json) funciona bien.Solía la
com.fasterxml.jackson.annotation.JsonAliascoherencia del paquete concom.fasterxml.jackson.databind.ObjectMappermi caso de uso.Por ejemplo:
Solo funciona bien.
fuente
Deben haber incluido esto como una característica, porque ahora establecer un diferente
@JsonPropertypara un captador y un definidor da como resultado exactamente lo que esperaría (nombre de propiedad diferente durante la serialización y deserialización para el mismo campo). Jackson versión 2.6.7fuente
Puede escribir una clase de serialización para hacer eso:
fuente