Нечувствительность к регистру 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>>(){});