如何使用Jackson Databind反序列化包含大小写不敏感枚举值的JSON字符串?
JSON字符串:
[{"url": "foo", "type": "json"}]
以及我的 Java POJO:
public static class Endpoint {
public enum DataType {
JSON, HTML
}
public String url;
public DataType type;
public Endpoint() {
}
}
在这种情况下,使用"type":"json"
反序列化JSON会失败,而"type":"JSON"
则可以工作。
但出于命名约定原因,我也希望"json"
能够起作用。将POJO序列化后,
"type":"JSON"
的大写格式也是结果。我考虑使用
@JsonCreator
和 @JsonGetter: @JsonCreator
private Endpoint(@JsonProperty("name") String url, @JsonProperty("type") String type) {
this.url = url;
this.type = DataType.valueOf(type.toUpperCase());
}
//....
@JsonGetter
private String getType() {
return type.name().toLowerCase();
}
它有效了。但我在想是否有更好的解决方案,因为这看起来像是一个hack。
我也可以编写自定义的反序列化器,但我有很多使用枚举的不同POJO,这将很难维护。
有人能提出更好的方法来序列化和反序列化枚举并遵守适当的命名约定吗?
我不希望我的Java枚举变成小写!
这是我使用的一些测试代码:
String data = "[{\"url\":\"foo\", \"type\":\"json\"}]";
Endpoint[] arr = new ObjectMapper().readValue(data, Endpoint[].class);
System.out.println("POJO[]->" + Arrays.toString(arr));
System.out.println("JSON ->" + new ObjectMapper().writeValueAsString(arr));