che*_*tan 3 java enums json jackson
我们使用Jackson 1.9.1对JSON请求响应字符串进行序列化和反序列化.原始Java类型,集合类型和自定义对象(序列化)没有问题.但是,我在尝试将JSON字符串反序列化为java枚举时遇到问题.JSON字符串是这样序列化的:
"wt":{"wt":100.5,"unit":{"LBS":3}}
Run Code Online (Sandbox Code Playgroud)
wt的Java类型是这样的:
public class Weight {
protected double weight;
protected Unit unit;
}
Run Code Online (Sandbox Code Playgroud)
我提到了这个,这个,以及这个在SO上,并提出了重量单位的枚举,如下:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我尝试反序列化上面提到的JSON时,我得到这个错误说:"无法识别的字段"LBS"(类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)
Run Code Online (Sandbox Code Playgroud)
...
我的问题是:枚举的序列化JSON字符串是否正确?我还应该包括(或注释)枚举是否正确反序列化?
我假设在public enum Unit代码块中,你的意思是Unit代替WeightMeasurementUnit.
本Weight类只有一个weight和unit,因此,如果你通过{"wt":100.5,"unit":"lbs"},它应该工作,因为unit仅仅是一个单位没有价值.因此,反序列化器无法解析{"LBS":3}为Unit.有什么3用?
另一个问题是你的值是"lbs",而你传递的是"LBS".因此,您需要标准化或需要使用unit.getValue().equalsIgnoreCase(val)
| 归档时间: |
|
| 查看次数: |
30456 次 |
| 最近记录: |