在java中反序列化json响应到自定义enum值



我试图用自定义枚举值反序列化JSON响应,但不是与自定义值映射,枚举正在用其序数值设置。我已经搜索了很多,我不知道我做错了什么。如果有任何帮助就太好了。

响应是

{"id":12, "status":1}

对应的enum对象和enum为

public class Car {
   int id;
   CarStatus status;
}

public enum CarStatus {
    
    READY(1),
    WAITING(2);
    private int value;
    CarStatus(int value) {
        this.value = value;
    }
    @JsonValue
    public int getValue() {
        return value;
    }
}

状态设置为WAITING,但我希望它设置为READY

你的enum miss @JsonCreator

试试:

public enum CarStatus {
    
    READY(1),
    WAITING(2);
    private int value;
    CarStatus(int value) {
        this.value = value;
    }
    @JsonValue
    public int getValue() {
        return value;
    }
    @JsonCreator
    public static CarStatus getItem(int code){
        for(CarStatus item : values()){
            if(item.getValue() == code){
                return item;
            }
        }
        return null;
    }
}

你可以看到我的代码在github: https://github.com/onemaomao/java-common-mistakes/tree/master/src/main/java/org/geekbang/time/questions/stackoverflow/reslove/q1

当将整数与仅@JsonValue注释结合使用时,这似乎是枚举的一个已知问题。Github上有一些与此相关的开放问题(例如1和2),目前计划在2.13版本中使用。

同时,您可以通过添加一个返回相应CarStatus@JsonCreator来解决这个问题:

public enum CarStatus {
    READY(1),
    WAITING(2);
    private final int value;
    CarStatus(int value) {
        this.value = value;
    }
    @JsonValue
    public int getValue() {
        return this.value;
    }
    @JsonCreator
    public static CarStatus getByValue(int value) {
        for (CarStatus status : values()) {
            if (status.value == value) {
                return status;
            }
        }
        return null;
    }
}

测试代码:

ObjectMapper objectMapper = new ObjectMapper();
Car original = new Car();
original.setId(45);
original.setStatus(CarStatus.READY);
String json = objectMapper.writeValueAsString(original);
Car reconstruction = objectMapper.readValue(json, Car.class);
System.out.println(json);
System.out.println(reconstruction.getStatus());

输出:

{"id":45,"status":1}
READY

相关内容

  • 没有找到相关文章

最新更新