我正在尝试序列化一个以枚举作为其成员之一的类。我尝试序列化的类中枚举的 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:名称为空
如何在不更改 setter 和 getter 的情况下正确序列化/反序列化(添加 @Json 标签就可以了)?
最佳答案
这个问题与 jackson 无关。这与您的 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);
关于java - Jackson 序列化枚举和非传统 setter / getter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31460969/