Comment désérialiser une chaîne JSON qui contient des valeurs d'énumération insensibles à la casse? (en utilisant Jackson Databind)
La chaîne JSON:
[{"url": "foo", "type": "json"}]
et mon Java POJO:
public static class Endpoint {
public enum DataType {
JSON, HTML
}
public String url;
public DataType type;
public Endpoint() {
}
}
dans ce cas, la désérialisation du JSON avec "type":"json"
échouerait là où "type":"JSON"
cela fonctionnerait. Mais je veux "json"
aussi travailler pour des raisons de convention de dénomination.
La sérialisation du POJO entraîne également des majuscules "type":"JSON"
J'ai pensé à utiliser @JsonCreator
et @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();
}
Et ça a marché. Mais je me demandais s'il y avait une meilleure solutuon parce que cela me semble être un hack.
Je peux aussi écrire un désérialiseur personnalisé mais j'ai beaucoup de POJO différents qui utilisent des énumérations et ce serait difficile à maintenir.
Quelqu'un peut-il suggérer une meilleure façon de sérialiser et de désérialiser les énumérations avec une convention de dénomination appropriée?
Je ne veux pas que mes énumérations en java soient en minuscules!
Voici un code de test que j'ai utilisé:
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));