【发布时间】:2014-08-01 05:01:15
【问题描述】:
如何反序列化包含不区分大小写的枚举值的 JSON 字符串? (使用 Jackson 数据绑定)
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();
}
它奏效了。但我想知道是否有更好的解决方案,因为这对我来说就像一个黑客。
我也可以编写一个自定义的反序列化器,但是我有很多不同的 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));
【问题讨论】:
-
您使用的是哪个版本的 Jackson?看看这个 JIRA jira.codehaus.org/browse/JACKSON-861
-
我使用的是 Jackson 2.2.3
-
好的,我刚刚更新到 2.4.0-RC3
标签: java json serialization enums jackson