从JSON反序列化Java枚举
我们使用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”(类abcdWeight),未标记为可忽略”异常stacktrace如下所示:
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字符串似乎正确吗?为了使枚举正确反序列化,我还应该包括什么(或添加注释)?
回答:
我假设在public enum Unit代码块中,您的意思是Unit而不是WeightMeasurementUnit。
本Weight类只有一个weight和unit,因此,如果你通过{"wt":100.5,"unit":"lbs"},它应该工作,因为unit仅仅是一个单位没有价值。因此,反序列化器无法解析{"LBS":3}为Unit。有什么3用
另一个问题是,当您传递“ LBS”时,您的值为“
lbs”。因此,您需要标准化或需要使用unit.getValue().equalsIgnoreCase(val)
以上是 从JSON反序列化Java枚举 的全部内容, 来源链接: utcz.com/qa/426498.html








