web-dev-qa-db-fra.com

JSON: JsonMappingException en essayant de désérialiser un objet avec des valeurs NULL

J'essaie de désérialiser un objet contenant des propriétés null et d'avoir la JsonMappingException.

Ce que je fais:

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!

MAIS: si vous voulez jeter la propriété "firstName = null" - tout fonctionne bien!

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 : Comment éviter cette exception ou s'engager que Jackson ignore les valeurs nulles pendant la sérialisation?

Lance:

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

18
VB_

Si vous ne souhaitez pas sérialiser les valeurs null, vous pouvez utiliser le paramètre suivant (lors de la sérialisation):

objectMapper.setSerializationInclusion(Include.NON_NULL);

J'espère que ceci résoudra votre problème.

Mais la NullPointerException que vous obtenez pendant la désérialisation me semble suspecte (Jackson devrait idéalement être capable de gérer les valeurs null dans la sortie sérialisée). Pourriez-vous poster le code correspondant à la classe PersonResponse?

18
Jackall

Parfois, ce problème se produit lors de l'utilisation accidentelle d'un type primitif comme type de retour du getter d'un champ non primitif:

public class Item
{
    private Float value;

    public float getValue()
    {
        return value;
    }

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

Notez le "float" au lieu de "Float" pour la méthode getValue (), cela peut conduire à une exception Null Pointer Exception, même si vous avez ajouté

objectMapper.setSerializationInclusion(Include.NON_NULL);
44
Neman

Ajoutez une annotation JsonProperty à votre attribut dans la classe TO, comme ci-dessous

@JsonProperty
private String id;
0
Shankar Murthy

J'ai aussi fait face au même problème.

Je viens d'inclure un constructeur par défaut dans la classe de modèle avec l'autre constructeur avec des paramètres.

Ça a marché.

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;
}
}
0
Abhiroop Nandi Ray