2014-09-26 14 views
12

Qualcuno sa come com.fasterxml.jackson.databind.ObjectMapper è in grado di associare le proprietà JSON alle proprietà POJO senza distinzione tra maiuscole e minuscole?Mappatura da JSON a POJO senza distinzione tra maiuscole e minuscole senza cambiare il POJO

JSON-String:

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

POJO-Classe:

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

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

Questo finisce nel seguente errore:
com.fasterxml. jackson.databind.JsonMappingException: impossibile deserializzare l'istanza di ...

Non è possibile modificare né JSON-String né POJO-Class.

+1

* Non è possibile modificare né JSON-String né POJO-Class *, allora non è possibile. –

risposta

6

Ho avuto lo stesso problema e non sono riuscito a trovare un modo globale per risolvere questo problema. Tuttavia è possibile avere 2 setter per casa per raggiungere questo obiettivo:

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

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

Non elegante, ma lavorerà per entrambi i campi JSON maiuscole e minuscole. Puoi anche provare la soluzione menzionata here ma questo potrebbe avere un overhead delle prestazioni

0

Ero nello stesso tipo di situazione e dovevo convertire in una mappa e quindi copiare i valori manualmente.

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

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

Questo comportamento è stato introdotto in Jackson 2.5.0. È possibile configurare il mapper in modo che non sia sensibile al maiuscolo/minuscolo utilizzando MapperFeature. ACCEPT_CASE_INSENSITIVE_PROPERTIES.

Ad esempio:

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