当前位置: 首页 > 面试题库 >

从JSON反序列化Java枚举

卢作人
2023-03-14
问题内容

我们使用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类只有一个weightunit,因此,如果你通过{"wt":100.5,"unit":"lbs"},它应该工作,因为unit仅仅是一个单位没有价值。因此,反序列化器无法解析{"LBS":3}Unit。有什么3

另一个问题是,当您传递“ LBS”时,您的值为“
lbs”。因此,您需要标准化或需要使用unit.getValue().equalsIgnoreCase(val)



 类似资料:
  • 问题内容: 我在Android上的Java中具有以下枚举,并且我希望能够将传入的JSON字符串/对象中的整数反序列化为此Enum类型。我一直在Jackson和GSON上受到欢迎,但在我正在使用的JSON.org包上却什么也没有。 有没有简单的方法可以做到这一点,或者我需要更改JSON解码器?谢谢。 问题答案: 将返回您的数组,然后可以遍历数组并检查

  • 我在Android上的Java中有以下枚举,我希望能够将传入的JSON字符串/对象中的整数反序列化为该枚举类型。我在杰克逊和GSON上得到了点击,但在json.org包上没有,我正在使用。 是否有一个简单的方法来做到这一点,或者我需要改变JSON解码器?谢了。

  • 我有一个简单的问题,假设我有这个json 以这种方式映射: 我想知道是否可以通过使用一些自定义setter/注释或其他东西在内部对象中保存一个外部字段: PS:由于json的复杂性,使用自定义反序列化是我最后的选择

  • 我有一个具有名称字段的界面,如下所示: 然后我会得到HTTP 400错误请求错误代码,其中包含以下异常日志: 抽象类型只能用附加类型信息实例化 模块的层次结构是模块B依赖于模块a。我尝试使用@JsonTypeInfo,但模块之间的依赖关系是一个限制,不允许我在@JsonSubtypes注释中为类C中的字段f使用BField.class。

  • 问题内容: 我如何使用gson 2.2.4序列化和反序列化一个简单的枚举? 问题答案: 根据 GsonAPI文档 ,Gson提供了的默认序列化/反序列化,因此基本上,应使用标准和方法(与其他类型一样)对序列化和反序列化。

  • 问题内容: 我正在使用JAVA 1.6和Jackson 1.9.9我有一个枚举 我添加了一个@JsonValue,这似乎可以将对象序列化为: 但是当我尝试反序列化时,我得到了 我在这里想念什么? 问题答案: 如果你希望将枚举类与其JSON表示完全脱钩,则@xbakesx指出的序列化器/反序列化器解决方案是一个很好的解决方案。 另外,如果你喜欢一个独立的解决方案,则基于·和·注释的实现会更方便。 因