J'utilise JAVA 1.6 et Jackson 1.9.9 J'ai une énumération
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;
}
}
J'ai ajouté un @JsonValue, cela semble faire le travail dans lequel il sérialise l'objet:
{"event":"forgot password"}
mais quand j'essaie de désérialiser je reçois 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
Qu'est-ce que j'oublie ici?
java
enums
jackson
jsonserializer
pookieman
la source
la source
{"Event":"FORGOT_PASSWORD"}
? Notez les plafonds à la fois sur Event et FORGOT_PASSWORD.getValue
celaGetValue
ne fonctionne pasRéponses:
La solution de sérialisation / désérialisation indiquée par @xbakesx est excellente si vous souhaitez découpler complètement votre classe enum de sa représentation JSON.
Alternativement, si vous préférez une solution autonome, une implémentation basée sur
@JsonCreator
et des@JsonValue
annotations serait plus pratique.Ainsi, en s'appuyant sur l'exemple de @Stanley, voici une solution complète et autonome (Java 6, Jackson 1.9):
la source
Notez qu'à partir de ce commit en juin 2015 (Jackson 2.6.2 et supérieur), vous pouvez maintenant simplement écrire:
la source
Vous devez créer une méthode d'usine statique qui accepte un seul argument et l'annoter avec
@JsonCreator
(disponible depuis Jackson 1.2)En savoir plus sur l'annotation JsonCreator ici .
la source
@JSONValue
sérialiser et@JSONCreator
désérialiser.@JsonCreator public static Event valueOf(int intValue) { ... }
désérialiserint
enEvent
énumérateur.Réponse réelle:
Le désérialiseur par défaut pour les enums utilise
.name()
pour désérialiser, donc il n'utilise pas le@JsonValue
. Donc, comme l'a souligné @OldCurmudgeon, vous devez passer{"event": "FORGOT_PASSWORD"}
pour correspondre à la.name()
valeur.Une autre option (en supposant que vous souhaitiez que les valeurs json d'écriture et de lecture soient identiques) ...
Plus d'informations:
Il existe (encore) une autre façon de gérer le processus de sérialisation et de désérialisation avec Jackson. Vous pouvez spécifier ces annotations pour utiliser vos propres sérialiseur et désérialiseur personnalisés:
Ensuite, vous devez écrire
MySerializer
etMyDeserializer
qui ressemblent à ceci:MySerializer
MyDeserializer
Dernier petit détail, en particulier pour faire cela à une énumération
JsonEnum
qui sérialise avec la méthodegetYourValue()
, votre sérialiseur et désérialiseur pourrait ressembler à ceci:la source
J'ai trouvé une solution très agréable et concise, particulièrement utile lorsque vous ne pouvez pas modifier les classes enum comme c'était le cas dans mon cas. Ensuite, vous devez fournir un ObjectMapper personnalisé avec une certaine fonctionnalité activée. Ces fonctionnalités sont disponibles depuis Jackson 1.6. Il vous suffit donc d'écrire la
toString()
méthode dans votre énumération.D'autres fonctionnalités liées à l'énumération sont disponibles, voir ici:
https://github.com/FasterXML/jackson-databind/wiki/Serialization-Features https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features
la source
Essaye ça.
la source
Vous pouvez personnaliser la désérialisation pour n'importe quel attribut.
Déclarez votre classe de désérialisation à l'aide de l'annotationJsonDeserialize (
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
) pour l'attribut qui sera traité. S'il s'agit d'un Enum:De cette façon, votre classe sera utilisée pour désérialiser l'attribut. Voici un exemple complet:
la source
Il existe différentes approches que vous pouvez adopter pour effectuer la désérialisation d'un objet JSON en une énumération. Mon style préféré est de créer une classe intérieure:
la source
Voici un autre exemple qui utilise des valeurs de chaîne au lieu d'une carte.
la source
Dans le contexte d'une énumération, l'utilisation de
@JsonValue
now (depuis 2.0) fonctionne pour la sérialisation et la désérialisation.Selon le javadoc annotations jackson pour
@JsonValue
:Donc, avoir l'
Event
énumération annotée comme ci-dessus fonctionne (pour la sérialisation et la désérialisation) avec jackson 2.0+.la source
Outre l'utilisation de @JsonSerialize @JsonDeserialize, vous pouvez également utiliser SerializationFeature et DeserializationFeature (liaison jackson) dans le mappeur d'objets.
Tels que DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE, qui donnent le type d'énumération par défaut si celui fourni n'est pas défini dans la classe enum.
la source
La manière la plus simple que j'ai trouvée consiste à utiliser l'annotation @ JsonFormat.Shape.OBJECT pour l'énumération.
la source
Dans mon cas, c'est ce qui a résolu:
Sérialise et désérialise le json suivant:
J'espère que ça aide!
la source