java - para - JSON: JsonMappingException mientras intenta deserializar un objeto con valores nulos
librerias json para java (4)
Intento deserializar el objeto que contiene propiedades nulas y tengo la JsonMappingException
.
Lo que hago:
String actual = "{/"@class/" : /"PersonResponse/"," +
" /"id/" : /"PersonResponse/"," +
" /"result/" : /"Ok/"," +
" /"message/" : /"Send new person object to the client/"," +
" /"person/" : {" +
" /"id/" : 51," +
" /"firstName/" : null}}";
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(new StringReader(json), PersonResponse.class); //EXCEPTION!
PERO : si tirar la "firstName = null"
- ¡todo funciona bien! Me refiero a pasar la siguiente cadena:
String test = "{/"@class/" : /"PersonResponse/"," +
" /"id/" : /"PersonResponse/"," +
" /"result/" : /"Ok/"," +
" /"message/" : /"Send new person object to the client/"," +
" /"person/" : {" +
" /"id/" : 51}}";
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(new StringReader(json), PersonResponse.class); //ALL WORKS FINE!
Pregunta : ¿Cómo evitar esta excepción o prometer que Jackson ignorará los valores nulos durante la serialización?
Tiros
Mensaje:
com.fasterxml.jackson.databind.MessageJsonException:
com.fasterxml.jackson.databind.JsonMappingException:
N/A (through reference chain: person.Create["person"]->Person["firstName"])
porque:
com.fasterxml.jackson.databind.MessageJsonException:
com.fasterxml.jackson.databind.JsonMappingException:
N/A (through reference chain: prson.Create["person"]->Person["firstName"])
causa: java.lang.NullPointerException
A veces, este problema se produce cuando se usa accidentalmente un tipo primitivo como tipo de retorno del captador de un campo no primitivo:
public class Item
{
private Float value;
public float getValue()
{
return value;
}
public void setValue(Float value)
{
this.value = value;
}
}
Observe el "flotador" en lugar de "Flotante" para el método getValue (), esto puede llevar a una excepción de puntero nulo, incluso cuando haya agregado
objectMapper.setSerializationInclusion(Include.NON_NULL);
Agregue la anotación JsonProperty a su atributo en la clase TO, como se muestra a continuación
@JsonProperty
private String id;
Si no desea serializar valores null
, puede usar la siguiente configuración (durante la serialización):
objectMapper.setSerializationInclusion(Include.NON_NULL);
Espero que esto resuelva tu problema.
Pero la NullPointerException
que obtienes durante la deserialización me parece sospechosa (Jackson idealmente debería ser capaz de manejar valores null
en la salida serializada). ¿Podrías publicar el código correspondiente a la clase PersonResponse
?
También me enfrenté a la misma cuestión.
Acabo de incluir un constructor predeterminado en la clase del modelo junto con el otro constructor con parámetros.
Funcionó.
package objmodel;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
public class CarModel {
private String company;
private String model;
private String color;
private String power;
public CarModel() {
}
public CarModel(String company, String model, String color, String power) {
this.company = company;
this.model = model;
this.color = color;
this.power = power;
}
@JsonDeserialize
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@JsonDeserialize
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
@JsonDeserialize
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@JsonDeserialize
public String getPower() {
return power;
}
public void setPower(String power) {
this.power = power;
}
}