我试图用自定义枚举值反序列化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