Come posso deserializzare una stringa JSON che contiene valori enum che non fanno distinzione tra maiuscole e minuscole? (utilizzando Jackson Databind)
La stringa JSON:
[{"url": "foo", "type": "json"}]
e il mio Java POJO:
public static class Endpoint {
public enum DataType {
JSON, HTML
}
public String url;
public DataType type;
public Endpoint() {
}
}
in questo caso, la deserializzazione del JSON con "type":"json"
fallirà dove "type":"JSON"
funzionerebbe. Ma voglio "json"
lavorare anche per nominare motivi di convenzione.
Serializzare il POJO risulta anche in lettere maiuscole "type":"JSON"
Ho pensato di usare @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 ha funzionato. Ma mi chiedevo se esista una soluzione migliore perché a me sembra un trucco.
Posso anche scrivere un deserializzatore personalizzato, ma ho molti POJO diversi che utilizzano enumerazioni e sarebbe difficile da mantenere.
Qualcuno può suggerire un modo migliore per serializzare e deserializzare le enumerazioni con una convenzione di denominazione appropriata?
Non voglio che le mie enumerazioni in java siano minuscole!
Ecco un po 'di codice di prova che ho usato:
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));