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
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?
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);
Fügen Sie Ihrem Attribut in der TO-Klasse die JsonProperty-Annotation hinzu (siehe unten)
@JsonProperty
private String id;
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;
}
}