¿Cómo puedo deserializar una cadena JSON que contiene valores de enumeración que no distinguen entre mayúsculas y minúsculas? (usando Jackson Databind)
La cadena JSON:
[{"url": "foo", "type": "json"}]
y mi POJO de Java:
public static class Endpoint {
public enum DataType {
JSON, HTML
}
public String url;
public DataType type;
public Endpoint() {
}
}
en este caso, la deserialización del JSON con "type":"json"
fallaría donde "type":"JSON"
funcionaría. Pero quiero "json"
trabajar también por razones de convenciones de nombres.
Serializar el POJO también resulta en mayúsculas "type":"JSON"
Pensé en usar @JsonCreator
y @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();
}
Y funcionó. Pero me preguntaba si hay una mejor solución porque esto me parece un truco.
También puedo escribir un deserializador personalizado, pero tengo muchos POJO diferentes que usan enumeraciones y sería difícil de mantener.
¿Alguien puede sugerir una mejor manera de serializar y deserializar enumeraciones con la convención de nomenclatura adecuada?
¡No quiero que mis enumeraciones en Java estén en minúsculas!
Aquí hay un código de prueba que utilicé:
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));