Нечувствительность к регистру JSON для POJO без изменения POJO
Кто-нибудь знает, как com.fasterxml.jackson.databind.ObjectMapper может отображать свойства JSON для свойств POJO без учета регистра?
JSON-строки:
[{ "FIRSTNAME": "Джон", "LASTNAME": "Доу", "DATEOFBIRTH": "1980-07-16T18: 25: 00.000Z" }]
POJO-Класс:
public class Person {
private String firstName;
private String lastName;
private Date dateOfBirth;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Date getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
}
Тест-Класс:
@Test
public final void testDeserializingPersonJsonToPersonClass()
throws JsonParseException, JsonMappingException, IOException {
final String jsonAsString = "[{\"FIRSTNAME\":\"John\",\"LASTNAME\":\"Doe\",\"DATEOFBIRTH\":\"1980-07-16T18:25:00.000Z\"}]";
final ObjectMapper mapper = new ObjectMapper();
final Person person = mapper.readValue(jsonAsString, Person.class);
assertNotNull(person);
assertThat(person.getFirstName(), equalTo("John"));
}
Это заканчивается следующей ошибкой:
com.fasterxml.jackson.databind.JsonMappingException: невозможно десериализовать экземпляр...
Невозможно изменить ни JSON-String, ни POJO-Class.
Ответы
Ответ 1
Это поведение было введено в Jackson 2.5.0. Вы можете настроить отображение нечувствительным к регистру с помощью MapperFeature. ACCEPT_CASE_INSENSITIVE_PROPERTIES.
Например:
ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
Ответ 2
У меня была та же проблема и не удалось найти глобальный способ решения этого. Однако для достижения этого вы можете иметь 2 сеттера на одно из следующих свойств:
@JsonSetter("FIRSTNAME")
public void setFirstNameCaps(String firstName) {
this.firstName = firstName;
}
@JsonSetter("firstName")
public void setFirstName(String firstName) {
this.firstName = firstName;
}
Не элегантный, но будет работать как для верхних, так и для нижних регистров json. Вы также можете попробовать решение, упомянутое здесь, но это может иметь служебные накладные расходы
Ответ 3
Я был в такой же ситуации, и мне пришлось преобразовать его в карту, а затем скопировать значения вручную.
import com.fasterxml.jackson.core.type.TypeReference;
Map<String, String> map =
mapper.readValue(jsonAsString, new TypeReference<Map<String, String>>(){});