不更改POJO的情况下,不区分大小写的JSON到POJO映射

有谁知道com.fasterxml.jackson.databind.ObjectMapper如何能够将JSON属性映射到POJO属性不区分大小写?

JSON字符串:

[{ “FIRSTNAME”: “约翰”, “LASTNAME”: “Doe的”, “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。

这种行为是在Jackson 2.5.0中引入的。 您可以使用MapperFeature将映射器配置为不区分大小写。 ACCEPT_CASE_INSENSITIVE_PROPERTIES 。

例如 :

 ObjectMapper mapper = new ObjectMapper(); mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); 

我有同样的问题,无法找到解决这个问题的全球方法。 但是,每个属性可以有2个setter来实现此目的:

 @JsonSetter("FIRSTNAME") public void setFirstNameCaps(String firstName) { this.firstName = firstName; } @JsonSetter("firstName") public void setFirstName(String firstName) { this.firstName = firstName; } 

不优雅,但适用于大小写json字段。 您也可以尝试这里提到的解决方案,但这可能会带来性能开销

我处于同样的情况,不得不转换为地图,然后手动复制值。

 import com.fasterxml.jackson.core.type.TypeReference; Map map = mapper.readValue(jsonAsString, new TypeReference>(){});