POJO

2014-09-26 27 views
12

'u değiştirmeden POJO eşlemesine büyük/küçük harf duyarlı olmayan JSON eşleştirmesi com.fasterxml.jackson.databind.ObjectMapper'ın JSON özelliklerini POJO özellikleri büyük/küçük harf duyarsızlığı ile nasıl eşleştirebileceğini bilen var mı?POJO

JSON Dize:

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

POJO Sınıf:

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-Sınıf:

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

Bu aşağıdaki hatayla biter:
com.fasterxml. jackson.databind.JsonMappingException: Örnekleştirilemiyor ...

Ne JSON-String ne de POJO-Class değiştirilemez.

+1

* Bu ne JSON Dize ne de POJO Sınıf * değiştirmek mümkün değil, o zaman mümkün değildir. –

cevap

6

Aynı problem vardı ve bunu çözmenin küresel bir yolunu bulamadım. Ancak bunu başarmak için mülk başına 2 ayarlayıcıları sahip olabilir:

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

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

şık değil ama hem büyük ve küçük harf json alanları için çalışacaktır. Ayrıca, here belirtilen çözümü de deneyebilirsiniz, ancak bu performansa ilişkin bir performansa sahip olabilir

0

Ben de aynı durumdaydım ve bir haritaya dönüştürüp değerleri manuel olarak kopyalamak zorunda kaldım.

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

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

Bu davranış, Jackson 2.5.0 sürümünde tanıtıldı. MapperFeature kullanarak mapper'ın büyük/küçük harfe duyarlı olmasını sağlayabilirsiniz. ACCEPT_CASE_INSENSITIVE_PROPERTIES. Örneğin

:

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