Jackson 1.9.1 を使用して、JSON 要求応答文字列を Java オブジェクトとの間でシリアライズおよびデシリアライズします。プリミティブ Java 型、コレクション型、およびカスタム オブジェクトは、問題なく (非) シリアル化されます。ただし、JSON 文字列を Java 列挙型にデシリアライズしようとすると問題が発生します。JSON 文字列は次のようにシリアル化されます。
"wt":{"wt":100.5,"unit":{"LBS":3}}
wt の Java タイプは次のようになります。
public class Weight {
protected double weight;
protected Unit unit;
}
SO でthis、this、およびthisを参照し、次のような重量単位の列挙型を思い付きました。
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;
}
}
問題は、上記の JSON を逆シリアル化しようとすると、「認識されないフィールド "LBS" (Class abcdWeight)、無視できるものとしてマークされていない」というエラーが表示されることです。
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)
...
私の質問は次のとおりです: enum のシリアル化された JSON 文字列は正しいようですか? 列挙型を適切に逆シリアル化するには、他に何を含める (または注釈を付ける) 必要がありますか?