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

Ответ 1

Если вы не хотите сериализовывать значения null, вы можете использовать следующую настройку (во время сериализации):

objectMapper.setSerializationInclusion(Include.NON_NULL);

Надеюсь, что это решает вашу проблему.

Но NullPointerException, который вы получаете во время десериализации, кажется мне подозрительным (Джексон должен в идеале иметь возможность обрабатывать значения null в сериализованном выходе). Не могли бы вы отправить код, соответствующий классу PersonResponse?

Ответ 2

Иногда эта проблема возникает при случайном использовании примитивного типа в качестве возвращаемого типа получателя не примитивного поля:

public class Item
{
    private Float value;

    public float getValue()
    {
        return value;
    }

    public void setValue(Float value)
    {
        this.value = value;
    }   
}

Обратите внимание на "float" вместо "Float" для метода getValue(), это может привести к исключению Null Pointer, даже если вы добавили

objectMapper.setSerializationInclusion(Include.NON_NULL);

Ответ 3

Я также столкнулся с той же проблемой.

Я просто включил конструктор по умолчанию в класс модели вместе с другим конструктором с параметрами.

Это сработало.

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

Ответ 4

Добавьте аннотацию JsonProperty к своему атрибуту в классе TO, как показано ниже

@JsonProperty
private String id;