Jak mogę deserializować ciąg JSON, który zawiera wartości wyliczenia, w których wielkość liter nie jest rozróżniana? (używając Jackson Databind)
Ciąg JSON:
[{"url": "foo", "type": "json"}]
i mój Java POJO:
public static class Endpoint {
public enum DataType {
JSON, HTML
}
public String url;
public DataType type;
public Endpoint() {
}
}
w takim przypadku deserializacja JSON z "type":"json"
nie powiedzie się w miejscu, w którym "type":"JSON"
działałoby. Ale chcę "json"
pracować również ze względu na konwencję nazewnictwa.
Serializacja POJO skutkuje również pisaniem wielkich liter "type":"JSON"
Myślałem o użyciu @JsonCreator
i @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();
}
I zadziałało. Ale zastanawiałem się, czy istnieje lepsze rozwiązanie, ponieważ dla mnie wygląda to na włamanie.
Mogę również napisać niestandardowy deserializator, ale mam wiele różnych POJO, które używają wyliczeń i byłoby to trudne do utrzymania.
Czy ktoś może zaproponować lepszy sposób serializacji i deserializacji wyliczeń z odpowiednią konwencją nazewnictwa?
Nie chcę, aby moje wyliczenia w Javie były pisane małymi literami!
Oto kod testowy, którego użyłem:
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));