java - Jackson 序列化枚举和非传统 setter / getter

标签 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:名称为空

如何在不更改 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/

相关文章:

java - 将原始资源设置为所选绘图中的壁纸

javascript - 合并存储在一个变量中的多个数组

java - 如何轻松地将 BufferedReader 转换为字符串?

jquery - 一起序列化多个表单?

java - 尝试了解 Java 枚举中函数的用法

javascript - 根据 TypeScript 中的字符串值属性对对象进行排序

c# - 如何强制派生类覆盖基类的枚举?

java - 自动化 Spring Cloud 简介

java - Google 搜索引擎仅返回 10 个结果

java - 如何在Java中使用Rest-assured来使用多部分文件附件?