2014-09-26 14 views
12

Có ai biết cách com.fasterxml.jackson.databind.ObjectMapper có thể ánh xạ thuộc tính JSON tới thuộc tính POJO không phân biệt chữ hoa chữ thường không?JSON phân biệt chữ hoa chữ thường với bản đồ POJO mà không thay đổi POJO

JSON-String:

[{"FIRSTNAME":"John","LASTNAME":"Doe","DATEOFBIRTH":"1980-07-16T18:25:00.000Z"}]

POJO-Class:

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-Class:

@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")); 
} 

này kết thúc trong lỗi sau:
com.fasterxml. jackson.databind.JsonMappingException: Không thể deserialize thể hiện của ...

Không thể thay đổi cả JSON-String lẫn POJO-Class.

+1

* Nó không thể thay đổi không JSON-String hay POJO-Class *, sau đó nó là không thể. –

Trả lời

6

Tôi đã gặp vấn đề tương tự và không thể tìm thấy cách giải quyết toàn cầu này. Tuy nhiên, bạn có thể có 2 bộ định cư cho mỗi thuộc tính để đạt được điều này:

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

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

Không thanh lịch nhưng sẽ hoạt động đối với cả trường chữ thường và chữ thường. Bạn cũng có thể thử giải pháp được đề cập here nhưng điều này có thể có chi phí hoạt động

0

Tôi đã ở trong tình trạng tương tự và phải chuyển sang bản đồ rồi sao chép giá trị theo cách thủ công.

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

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

Hành vi này đã được giới thiệu trong Jackson 2.5.0. Bạn có thể cấu hình trình ánh xạ không phân biệt chữ hoa chữ thường bằng MapperFeature. ACCEPT_CASE_INSENSITIVE_PROPERTIES.

Ví dụ:

ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); 
Các vấn đề liên quan