2014-09-26 47 views
12

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

JSON字符串:

[{"FIRSTNAME":"John","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。

+1

*这是不可能改变既不JSON字符串也不POJO级*,那么它是不可能的。 – 2014-09-26 11:51:45

回答

6

我有同样的问题,找不到解决此问题的全局方法。然而,你可以为每个属性2个setter方法来实现这一目标:

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

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

不优雅,但将两个大写和小写JSON下地干活。您也可以尝试提到的解决方案here,但这可能会产生性能开销

0

我处于同一种情况,必须转换为地图,然后手动复制这些值。

import com.fasterxml.jackson.core.type.TypeReference; 

Map<String, String> map = 
    mapper.readValue(jsonAsString, new TypeReference<Map<String, String>>(){}); 
21

此行为是在杰克逊2.5.0中引入的。您可以使用MapperFeature将映射器配置为不区分大小写。​​。

例如:

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