Désérialiser enum de java à partir de JSON
Nous utilisons Jackson 1.9.1 pour sérialiser et désérialiser JSON demande de la chaîne de réponse à/à partir d'objets Java. Primitifs de Java les types, les types de collection et des objets personnalisés sont (de)sérialisé sans problèmes. Cependant, j'ai un problème en essayant de désérialiser chaîne JSON en java enum.
Chaîne JSON est sérialisé comme suit:
"wt":{"wt":100.5,"unit":{"LBS":3}}
Type Java pour wt est comme suit:
public class Weight {
protected double weight;
protected Unit unit;
}
J'ai évoqué cette, cette, et cette sur DONC et est venu avec enum pour les unités de poids comme suit:
public enum Unit {
KG("kg"),
GM("gm"),
LBS("lbs"),
OZ("oz");
private String value;
private WeightMeasurementUnit(String value) { this.value = value; }
@JsonValue
public String getValue() { return this.value; }
@JsonCreator
public static Unit create(String val) {
Unit[] units = Unit.values();
for (Unit unit : units) {
if (unit.getValue().equals(val)) {
return unit;
}
}
return LBS;
}
}
Le problème est que lorsque j'ai jamais essayer de désérialiser mentionnés ci-dessus JSON, j'obtiens cette erreur en disant: "non reconnu champ "LB" (Classe un.b.c.d.Le poids), ne sont pas marqués comme ignorable" Exception stacktrace est comme suit:
Caused by: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "LBS" (Class a.b.c.d.Weight), not marked as ignorable
at [Source: java.io.ByteArrayInputStream@20172017; line: 1, column: 464] (through reference chain: a.b.c.d.MyRequest["blah"]->a.b.c.d.AnotherType["wt"]->a.b.c.d.Weight["LBS"])
at org.codehaus.jackson.map.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:53)
at org.codehaus.jackson.map.deser.StdDeserializationContext.unknownFieldException(StdDeserializationContext.java:267)
at org.codehaus.jackson.map.deser.std.StdDeserializer.reportUnknownProperty(StdDeserializer.java:673)
at org.codehaus.jackson.map.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:659)
at org.codehaus.jackson.map.deser.BeanDeserializer.handleUnknownProperty(BeanDeserializer.java:1365)
...
Mes questions sont les suivantes:
Est sérialisé chaîne JSON pour enum semble correct ?
Que dois-je inclure (ou d'annoter) pour l'enum pour être correctement désérialisé ?
- Juste deviner ressemble à des numéros de votre champs de type enum dans l'ordre lors de la sérialisation, KG = 1, GM = 2, etc. Cela fonctionne si vous utilisez ces numéros de votre enum initialiseurs je.e à utiliser KG(1); GM(2); LIVRES(3); OZ(4); dans la définition de l'enum Unité ?
Vous devez vous connecter pour publier un commentaire.
Je suis en supposant que dans la
public enum Unit
bloc de code, tu veux direUnit
au lieu deWeightMeasurementUnit
.La
Weight
classe a seulement unweight
et ununit
, donc si vous passez{"wt":100.5,"unit":"lbs"}
, il doit travailler, parce qu'ununit
est juste une unité sans valeur. Donc, il n'y a aucun moyen pour le deserializer pour analyser{"LBS":3}
comme unUnit
. Qu'est-ce que le3
pour?Un autre problème, c'est que votre valeur est "livres", alors que vous êtes de passage "LB". Donc, soit vous avez besoin de standardiser ou vous avez besoin d'utiliser
unit.getValue().equalsIgnoreCase(val)
Je vous suggère de mettre à jour votre jackson version 2.7.0-rc2 (et probablement avant) et ensuite configurer le ObjectMapper comme suit:
Dans votre enum vous suffit de surcharger la méthode toString ():
Vous n'avez pas besoin de toutes les annotations personnalisées ou deserializers.
Ce serait la voie à la carte d'un simple enum pour un json et vice-versa.
Si votre enum doit être mappé à partir d'une chaîne de caractères spéciaux, vous devez ajouter un champ de valeur et un Constructeur qui attribue ce domaine et de renvoyer la valeur de la méthode toString.