web-dev-qa-db-ja.com

JSON:null値でオブジェクトをデシリアライズしようとすると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!

[〜#〜] but [〜#〜]:捨てる場合"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"])

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

20
VB_

null値をシリアル化しない場合は、次の設定を使用できます(シリアル化中)。

objectMapper.setSerializationInclusion(Include.NON_NULL);

これで問題が解決することを願っています。

しかし、逆シリアル化中に取得するNullPointerExceptionは私には疑わしいようです(Jacksonは、理想的には、シリアル化された出力でnull値を処理できるはずです)。 PersonResponseクラスに対応するコードを投稿できますか?

19
Jackall

プリミティブ型を誤って非プリミティブフィールドのゲッターの戻り型として使用すると、この問題が発生することがあります。

public class Item
{
    private Float value;

    public float getValue()
    {
        return value;
    }

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

GetValue()メソッドの「Float」ではなく「float」に注意してください。

objectMapper.setSerializationInclusion(Include.NON_NULL);
49
Neman

以下のように、TOクラスの属性にJsonProperty注釈を追加します

@JsonProperty
private String id;
0
Shankar Murthy

私も同じ問題に直面しました。

モデルクラスに、パラメーターを持つ他のコンストラクターと共に既定のコンストラクターを追加しました。

出来た。

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