2014-09-26 80 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);