responsebody online example convertir convert java json data-binding case-insensitive fasterxml

online - json to object java gson



Asignación de mayúsculas y minúsculas de JSON a POJO sin cambiar el POJO (4)

¿Alguien sabe cómo com.fasterxml.jackson.databind.ObjectMapper es capaz de asignar propiedades JSON a propiedades POJO sin distinción entre mayúsculas y minúsculas?

Cadena JSON:

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

Clase 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; } }

Clase de prueba:

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

Esto termina en el siguiente error:
com.fasterxml.jackson.databind.JsonMappingException: no se puede deserializar la instancia de ...

No es posible cambiar ni JSON-String ni POJO-Class.


Estaba en el mismo tipo de situación y tuve que convertir a un mapa y luego copiar los valores manualmente.

import com.fasterxml.jackson.core.type.TypeReference; Map<String, String> map = mapper.readValue(jsonAsString, new TypeReference<Map<String, String>>(){});


Este comportamiento se introdujo en Jackson 2.5.0. Puede configurar el asignador para que no distinga entre mayúsculas y minúsculas con MapperFeature. ACCEPT_CASE_INSENSITIVE_PROPERTIES .

Por ejemplo :

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


Puede resolver este problema configurando el mapeador, como lo describe @Nicolas Riousset.

Además, desde la versión Jackson 2.9 puede hacer lo mismo usando la anotación @JsonFormat(with = JsonFormat.Feature.ACCEPT_CASE_INSENSITIVE_PROPERTIES) sobre un campo o clase, que es una opción más flexible.

@JsonFormat(with = JsonFormat.Feature.ACCEPT_CASE_INSENSITIVE_PROPERTIES) private String firstName;


Tuve el mismo problema y no pude encontrar una forma global de resolver esto. Sin embargo, puede tener 2 setters por propiedad para lograr esto:

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

No es elegante, pero funcionará para los campos json en mayúsculas y minúsculas. También puede probar la solución mencionada here pero esto podría tener una sobrecarga de rendimiento