JSON: JsonMappingException при попытке десериализовать объект с нулевыми значениями
Я пытаюсь десериализовать объект, который содержит значение null-свойства и JsonMappingException
.
что я делаю:
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!
но: если выбросить "firstName = null"
свойство-все работает нормально!
Я имею в виду передать следующую строку:
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!
вопрос: Как избежать этого исключения или пообещать Джексону игнорировать нулевые значения во время сериализация?
Броски:
сообщение:
com.fasterxml.jackson.databind.MessageJsonException:
com.fasterxml.jackson.databind.JsonMappingException:
N/A (through reference chain: person.Create["person"]->Person["firstName"])
причина:
com.fasterxml.jackson.databind.MessageJsonException:
com.fasterxml.jackson.databind.JsonMappingException:
N/A (through reference chain: prson.Create["person"]->Person["firstName"])
причина: java.lang.NullPointerException
3 ответов
если вы не хотите сериализовать null
значения, вы можете использовать следующую настройку (во время сериализации):
objectMapper.setSerializationInclusion(Include.NON_NULL);
надеюсь, что это решит вашу проблему.
но NullPointerException
вы получаете во время десериализации, кажется мне подозрительным (Джексон в идеале должен уметь обрабатывать null
значения в сериализованном выход). Не могли бы вы опубликовать код, соответствующий PersonResponse
класса?
иногда эта проблема возникает при случайном использовании примитивного типа в качестве возвращаемого типа геттера непримитивного поля:
public class Item
{
private Float value;
public float getValue()
{
return value;
}
public void setValue(Float value)
{
this.value = value;
}
}
обратите внимание на "float" вместо "Float" для метода getValue()-это может привести к исключению нулевого указателя, даже если вы добавили
objectMapper.setSerializationInclusion(Include.NON_NULL);
Я также столкнулся с той же проблемой.
Я просто включил конструктор по умолчанию в класс model вместе с другим конструктором с параметрами.
это сработало.
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;
}
}