Як я можу десеріалізувати рядок JSON, що містить значення переліку, які не враховують регістр? (за допомогою Jackson Databind)
Рядок JSON:
[{"url": "foo", "type": "json"}]
і моя Java POJO:
public static class Endpoint {
public enum DataType {
JSON, HTML
}
public String url;
public DataType type;
public Endpoint() {
}
}
у цьому випадку десериалізація JSON за допомогою "type":"json"
не спрацює, де "type":"JSON"
б це працювало. Але я хочу "json"
також працювати над причинами прийняття імен.
Серіалізація POJO також призводить до верхнього регістру "type":"JSON"
Я думав використовувати @JsonCreator
та @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();
}
І це спрацювало. Але мені було цікаво, чи є кращий варіант, тому що це для мене виглядає як хак.
Я також можу написати власний десериалізатор, але я отримав багато різних POJO, які використовують перерахування, і це було б важко підтримувати.
Хтось може запропонувати кращий спосіб серіалізації та десеріалізації перелічень за допомогою правильної конвенції про іменування?
Я не хочу, щоб мої переліки в Java були малими!
Ось декілька тестових кодів, які я використовував:
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));