Estoy usando JAVA 1.6 y Jackson 1.9.9 Tengo una enumeración
public enum Event {
FORGOT_PASSWORD("forgot password");
private final String value;
private Event(final String description) {
this.value = description;
}
@JsonValue
final String value() {
return this.value;
}
}
He agregado un @JsonValue, esto parece hacer el trabajo en el que serializa el objeto:
{"event":"forgot password"}
pero cuando trato de deserializar me sale un
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not construct instance of com.globalrelay.gas.appsjson.authportal.Event from String value 'forgot password': value not one of declared Enum instance names
¿Que me estoy perdiendo aqui?
java
enums
jackson
jsonserializer
pookieman
fuente
fuente
{"Event":"FORGOT_PASSWORD"}
? Tenga en cuenta los límites en el evento y FORGOT_PASSWORD.getValue
estoGetValue
no funcionaRespuestas:
La solución de serializador / deserializador señalada por @xbakesx es excelente si desea desacoplar completamente su clase enum de su representación JSON.
Alternativamente, si se prefiere una solución en sí misma, una implementación basada en
@JsonCreator
y@JsonValue
anotaciones serían más conveniente.Aprovechando el ejemplo de @Stanley, la siguiente es una solución completa e independiente (Java 6, Jackson 1.9):
fuente
Tenga en cuenta que a partir de este compromiso en junio de 2015 (Jackson 2.6.2 y superior) ahora puede simplemente escribir:
fuente
Debe crear un método de fábrica estático que tome un solo argumento y lo anote con
@JsonCreator
(disponible desde Jackson 1.2)Lea más sobre la anotación JsonCreator aquí .
fuente
@JSONValue
serializar y@JSONCreator
deserializar.@JsonCreator public static Event valueOf(int intValue) { ... }
para deserializarint
alEvent
enumerador.Respuesta real:
El deserializador predeterminado para enums usa
.name()
para deserializar, por lo que no está usando el@JsonValue
. Entonces, como señaló @OldCurmudgeon, tendrías que pasar{"event": "FORGOT_PASSWORD"}
para que coincida con el.name()
valor.Otra opción (suponiendo que desea que los valores json de escritura y lectura sean los mismos) ...
Más información:
Hay (aún) otra forma de gestionar el proceso de serialización y deserialización con Jackson. Puede especificar estas anotaciones para usar su propio serializador y deserializador personalizados:
Luego tienes que escribir
MySerializer
yMyDeserializer
que se ve así:MySerializer
MyDeserializer
Por último, especialmente para hacer esto en una enumeración
JsonEnum
que serializa con el métodogetYourValue()
, su serializador y deserializador podrían verse así:fuente
He encontrado una solución muy agradable y concisa, especialmente útil cuando no puede modificar las clases de enumeración como era en mi caso. Luego, debe proporcionar un ObjectMapper personalizado con una determinada característica habilitada. Esas características están disponibles desde Jackson 1.6. Entonces solo necesita escribir el
toString()
método en su enumeración.Hay más funciones relacionadas con la enumeración disponibles, consulte aquí:
https://github.com/FasterXML/jackson-databind/wiki/Serialization-Features https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features
fuente
Prueba esto.
fuente
Puede personalizar la deserialización para cualquier atributo.
Declare su clase deserialize usando annotationJsonDeserialize (
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
) para el atributo que se procesará. Si esto es una enumeración:De esta manera, su clase se utilizará para deserializar el atributo. Este es un ejemplo completo:
fuente
Hay varios enfoques que puede tomar para lograr la deserialización de un objeto JSON en una enumeración. Mi estilo favorito es hacer una clase interna:
fuente
Aquí hay otro ejemplo que usa valores de cadena en lugar de un mapa.
fuente
En el contexto de una enumeración, usar
@JsonValue
now (since 2.0) funciona para la serialización y deserialización.Según las anotaciones de jackson javadoc para
@JsonValue
:Por lo tanto, tener la
Event
enumeración anotada tal como funciona anteriormente (tanto para la serialización como para la deserialización) con jackson 2.0+.fuente
Además de usar @JsonSerialize @JsonDeserialize, también puede usar SerializationFeature y DeserializationFeature (enlace jackson) en el mapeador de objetos.
Como DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE, que dan el tipo de enumeración predeterminado si el proporcionado no está definido en la clase de enumeración.
fuente
La forma más simple que encontré es usar la anotación @ JsonFormat.Shape.OBJECT para la enumeración.
fuente
En mi caso, esto es lo que se resolvió:
Serializa y deserializa los siguientes json:
¡Espero que ayude!
fuente