Como posso desserializar a string JSON que contém valores enum que não diferenciam maiúsculas de minúsculas? (usando Jackson Databind)
A string JSON:
[{"url": "foo", "type": "json"}]
e meu Java POJO:
public static class Endpoint {
public enum DataType {
JSON, HTML
}
public String url;
public DataType type;
public Endpoint() {
}
}
neste caso, desserializar o JSON com "type":"json"
falharia onde "type":"JSON"
funcionaria. Mas eu quero "json"
trabalhar também por motivos de convenção de nomenclatura.
Serializar o POJO também resulta em letras maiúsculas "type":"JSON"
Pensei em usar @JsonCreator
e @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();
}
E funcionou. Mas eu queria saber se há uma solução melhor, porque isso parece um hack para mim.
Também posso escrever um desserializador personalizado, mas tenho muitos POJOs diferentes que usam enums e seria difícil de manter.
Alguém pode sugerir uma maneira melhor de serializar e desserializar enums com a convenção de nomenclatura adequada?
Não quero que meus enums em java sejam minúsculos!
Aqui está um código de teste que usei:
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));