Wie kann ich eine JSON-Zeichenfolge deserialisieren, die Aufzählungswerte enthält, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird? (mit Jackson Databind)
Die JSON-Zeichenfolge:
[{"url": "foo", "type": "json"}]
und mein Java POJO:
public static class Endpoint {
public enum DataType {
JSON, HTML
}
public String url;
public DataType type;
public Endpoint() {
}
}
In diesem Fall würde das Deserialisieren des JSON mit "type":"json"
fehlschlagen, wo "type":"JSON"
dies funktionieren würde. Aber ich möchte "json"
auch aus Gründen der Namenskonvention arbeiten.
Die Serialisierung des POJO führt auch zu Großbuchstaben "type":"JSON"
Ich dachte an @JsonCreator
und @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();
}
Und es hat funktioniert. Aber ich habe mich gefragt, ob es eine bessere Lösung gibt, weil das für mich wie ein Hack aussieht.
Ich kann auch einen benutzerdefinierten Deserializer schreiben, aber ich habe viele verschiedene POJOs, die Aufzählungen verwenden, und es wäre schwierig, sie zu warten.
Kann jemand einen besseren Weg vorschlagen, um Enums mit der richtigen Namenskonvention zu serialisieren und zu deserialisieren?
Ich möchte nicht, dass meine Aufzählungen in Java in Kleinbuchstaben geschrieben werden!
Hier ist ein Testcode, den ich verwendet habe:
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));