杰克逊序列化枚举和非传统的二传手/吸气剂

时间:2015-07-16 17:37:33

标签: java json enums jackson

我正在尝试序列化一个枚举作为其成员之一的类。我尝试序列化的类中枚举的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标记是否合适)?

1 个答案:

答案 0 :(得分:3)

问题与杰克逊无关。它与你的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);