【问题标题】:Jackson Serializing Enums And Non Traditional Setters/GettersJackson 序列化枚举和非传统的 Setter/Getter
【发布时间】:2015-07-16 17:37:32
【问题描述】:

我正在尝试序列化一个将枚举作为其成员之一的类。我试图序列化的类中枚举的 setter 和 getter 不遵循经典格式。下面是我的意思的一个例子

public class myObj { 
    private StateEnum state;

    public String getState() { // Problem with this getter
        return state == null ? null : state.name();
    }

    public void setState(String state) { // Problem with this setter
        this.state = StateEnum.valueOf(state);
    }
}

public enum StateEnum implements Cloneable {
    ACTIVE("Active"), 
    PREPROCESS("Preprocessing"), 
    SELECT("Selecting");

    private final String description;

    EntityState(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return "EntityState: " + this.description;
    }

}

目前要序列化/反序列化,我正在使用类似于以下内容的东西。

myObj obj = new myObj();
ObjectMapper omap = new ObjectMapper();
String payload = omap.writeValueAsString(obj);
myObj deserializedObj = omap.readValue(obj);

我得到了错误: com.fasterxml.jackson.databind.JsonMappingException: Name is null

如何在不更改 setter 和 getter 的情况下进行正确的序列化/反序列化(添加 @Json 标签是可以的)?

【问题讨论】:

    标签: java json enums jackson


    【解决方案1】:

    这个问题与杰克逊无关。这与您的 setter 未正确处理 null 并因此引发 NullPointerException 有关。

    如果您已阅读异常的完整堆栈跟踪(并将其发布,以避免强迫我们猜测问题),您会注意到它:

    Caused by: java.lang.NullPointerException: Name is null
        at java.lang.Enum.valueOf(Enum.java:236)
        at com.foo.StateEnum.valueOf(StateEnum.java:3)
        at com.foo.MyObj.setState(MyObj.java:15)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at com.fasterxml.jackson.databind.deser.impl.MethodProperty.set(MethodProperty.java:113)
    

    替换为

    this.state = state == null ? null : StateEnum.valueOf(state);
    

    【讨论】:

    • 感谢修复它。我没有发布完整堆栈跟踪的原因是因为我实际上正在做与我上面发布的示例完全不同的事情。这个例子过于简单化了。这是一个旧代码库,其他人编写了 setter/getter,我只是假设它有效。再次感谢您的好收获
    猜你喜欢
    • 2017-10-30
    • 2019-04-23
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2015-10-19
    • 2016-10-16
    相关资源
    最近更新 更多