【发布时间】:2013-09-01 13:00:28
【问题描述】:
我们使用 Jackson 1.9.1 序列化和反序列化与 Java 对象之间的 JSON 请求响应字符串。原始 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”(类 a.b.c.d.Weight),未标记为可忽略”异常堆栈跟踪如下:
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)
...
我的问题是: 枚举的序列化 JSON 字符串是否正确? 为了正确反序列化枚举,我还应该包含(或注释)什么?
【问题讨论】:
-
只是猜测 - 看起来它在序列化时按顺序编号您的枚举字段,KG = 1,GM = 2 等。如果您使用这些数字作为枚举初始化程序,它是否有效,即使用 KG(1 );总经理(2);磅(3);盎司(4);在枚举单元的定义中?
-
你的问题解决了我的问题。我正在寻找注释
@JsonValue和@JsonCreator。 -
非常正确;在获取值的 getValue/OverriddenToString 上添加了
@JsonValue,在匹配 EnumName/EnumValue 的 matchFromString 自定义方法上添加了@JsonCreator!