webentwicklung-frage-antwort-db.com.de

JSON: JsonMappingException beim Versuch, ein Objekt mit Nullwerten zu deserialisieren

Ich versuche, ein Objekt zu deserialisieren, das NULL-Eigenschaften enthält, und habe das JsonMappingException.

Was ich mache:

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!

ABER: wenn "firstName = null"-Eigenschaft weggeworfen wird - alles funktioniert gut! Ich meine, übergeben Sie die nächste Zeichenfolge:

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!

Frage : Wie kann man diese Ausnahme vermeiden oder Jackson verpflichten, während der Serialisierung Nullwerte zu ignorieren?

Würfe:

Botschaft: 

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

Ursache: 

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

Ursache:Java.lang.NullPointerException

18
VB_

Wenn Sie keine null-Werte serialisieren möchten, können Sie (während der Serialisierung) folgende Einstellung verwenden:

objectMapper.setSerializationInclusion(Include.NON_NULL);

Hoffe, das löst dein Problem.

Die NullPointerException, die Sie während der Deserialisierung erhalten, erscheint mir jedoch misstrauisch (Jackson sollte idealerweise mit null-Werten in der serialisierten Ausgabe umgehen können). Könnten Sie den Code entsprechend der PersonResponse-Klasse posten?

18
Jackall

Dieses Problem tritt manchmal auf, wenn Sie versehentlich einen primitiven Typ als Rückgabetyp des Getters eines nicht primitiven Felds verwenden:

public class Item
{
    private Float value;

    public float getValue()
    {
        return value;
    }

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

Beachten Sie das "float" anstelle von "float" für die getValue () - Methode. Dies kann zu einer Nullzeiger-Ausnahme führen, selbst wenn Sie hinzugefügt haben

objectMapper.setSerializationInclusion(Include.NON_NULL);
44
Neman

Fügen Sie Ihrem Attribut in der TO-Klasse die JsonProperty-Annotation hinzu (siehe unten)

@JsonProperty
private String id;
0
Shankar Murthy

Ich stand auch vor demselben Problem.

Ich habe einfach einen Standardkonstruktor in die Modellklasse aufgenommen, zusammen mit dem anderen Konstruktor mit Parametern.

Es funktionierte.

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