¿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 @JsonProperty
anotaciones 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
@jsonAlias
que se introdujo en jackson 2.9.0Ejemplo:
Esto se usa
r
durante la serialización, pero permitered
como un alias durante la deserialización. Sin embargo, esto también permiter
ser deserializado.fuente
has no effect during serialization where primary name is always used
. Esto no es lo que quiere el OP.r
como nombre principal, perored
para el@JsonAlias
, que permite serializarlor
, pero agregared
ser 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
@JsonGetter
y@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
@JsonProperty
Aquí 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
@JsonAlias
que se introdujo con Jackson 2.9+, sin mencionar@JsonProperty
el 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.JsonAlias
coherencia del paquete concom.fasterxml.jackson.databind.ObjectMapper
mi caso de uso.Por ejemplo:
Solo funciona bien.
fuente
Deben haber incluido esto como una característica, porque ahora establecer un diferente
@JsonProperty
para 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