java - 使用工厂方法使用 @JsonCreator 反序列化枚举

标签 java json serialization enums jackson

我正在尝试使用 jackson 将 json 反序列化为枚举。如果工厂方法只有一个参数,它工作正常。一旦我们添加更多参数,它就会停止工作。

这是我试过的代码示例。

public enum Test {
    FIRST(1, "first");

    private final int intProp;
    private final String stringProp;

    Test(int i, String stringProp) {
        this.stringProp = stringProp;
        this.intProp = i;
    }

    private static final Map<String, Test> allEntries = new HashMap<>(Test.values().length);
    static {
        for(Test each : Test.values()){
            allEntries.put(getCode(each.intProp, each.stringProp), each);
        }
    }

    private static String getCode(int i, String s){
        return s + i;
    }

    @JsonCreator(mode = Mode.PROPERTIES)
    public static Test forValues(@JsonProperty("intProp") int intProp,
                                 @JsonProperty("stringProp") String stringProp
                                 ){
        return allEntries.get(getCode(intProp,stringProp));
    }
}

使用以下代码反序列化json

String json = "{\"intProp\":1,\"stringProp\":\"first\"}";
ObjectMapper mapper = new ObjectMapper();

Test enumValue = mapper.readValue(json, Test.class); //fails 

这是我遇到的异常

com.fasterxml.jackson.databind.JsonMappingException: Unsuitable method

版本:jackson-databind 2.5.1,jackson-annotations 2.5.0

我不想编写自定义反序列化器,是我的方法有误还是 jackson 不支持该选项?

当使用 class 而不是 enum 时,同样的事情也有效。

最佳答案

看起来 jackson 库中实际上缺少此功能。我在 jackson-databind github project 中打开了一个问题.将不得不等待他们在即将发布的版本中修复它。

关于java - 使用工厂方法使用 @JsonCreator 反序列化枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32538281/

相关文章:

java - mysql jdbc 驱动程序无法识别 latin1 字符

java - Json 解析问题(值自动更改为 float )

python - Objective C 到 Python 序列化

c# - c++反序列化通过UDP从C#应用程序发送的对象

android - 保存我的序列化类,它没有像 Rect 这样的对象序列化

java - 如何在 UserType nullSafeGet 中获取对象的类型

java - 我在 JPanel 上显示 BufferedImage 和文本字段时遇到问题

javascript - 如何在 jQuery 中检索 flot 饼图的数据?

java - 在 JavaFX ScatterChart 中为数据系列设置八种以上颜色

java - 如何在没有 JAXBElement 包装器的情况下对 JAXBElement 包装的响应进行 JSON 编码?