Как десериализовать строку JSON, содержащую значения перечисления без учета регистра? (с использованием Jackson Databind)
Строка JSON:
[{"url": "foo", "type": "json"}]
и мой Java POJO:
public static class Endpoint {
public enum DataType {
JSON, HTML
}
public String url;
public DataType type;
public Endpoint() {
}
}
в этом случае десериализация JSON с помощью не "type":"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));