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