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