29

I try to deserialize object that contains null-properties and have the JsonMappingException.

What I do:

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!

BUT: if to throw away "firstName = null" property - all works fine! I mean pass the next string:

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!

Question: How to avoid this exception or to pledge Jackson ignore null-values during serialization?

Throws:

Message:

com.fasterxml.jackson.databind.MessageJsonException:
 com.fasterxml.jackson.databind.JsonMappingException:
  N/A (through reference chain: person.Create["person"]->Person["firstName"])

cause:

com.fasterxml.jackson.databind.MessageJsonException:
 com.fasterxml.jackson.databind.JsonMappingException:
  N/A (through reference chain: prson.Create["person"]->Person["firstName"])

cause: java.lang.NullPointerException

4 Answers 4

58

Sometimes this problem occurs when accidentally using a primitive type as return type of the getter of a non-primitive field:

public class Item
{
    private Float value;

    public float getValue()
    {
        return value;
    }

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

Notice the "float" instead of "Float" for the getValue()-method, this can lead to a Null Pointer Exception, even when you have added

objectMapper.setSerializationInclusion(Include.NON_NULL);
Sign up to request clarification or add additional context in comments.

7 Comments

Yes. And note that this is because of implicit coercion in getValue(), which is basically doing "return value.floatValue()" to get primitive -- hence NPE. Caller has no way of avoiding that, or knowing there is such a problem (unless it went and decoded bytecode etc).
You sir saved my day :) I had a Boolean value, but accidently in the getter had it as a boolean and it was null :D
This was it. I also had a Boolean and a method boolean get...().
And my issue was that the getter / setter was had a typo. After I recreated the getters and setters using Eclipse's tools, everything works
you are a savior. I was debugging it and analysing like a big issue and this was a simple mistake on my side. thanks so much :)
|
22

If you don't want to serialize null values, you can use the following setting (during serialization):

objectMapper.setSerializationInclusion(Include.NON_NULL);

Hope this solves your problem.

But the NullPointerException you get during deserialization seems suspicious to me (Jackson should ideally be able to handle null values in the serialized output). Could you post the code corresponding to the PersonResponse class?

3 Comments

hah. I also have collections in my person-class, so I need to set Include.NOT_EMPTY. Thanks!!!
Where should I put the objectMapper? within controller? or in the POJO bean? thanks....
It's NON_EMPTY not NOT_EMPTY
3

I also faced the same issue.

I just included a default constructor in the model class along with the other constructor with parameters.

It worked.

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

2 Comments

I also tried removing the annotations "@JsonDeserialize" and also removing the line objectmapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); It worked fine!!
Had to add super() in the default constructor to make it work.
0

Add JsonProperty annotation to your attribute in TO class, as below

@JsonProperty
private String id;

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.