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