1

私はこれについて何時間も頭を悩ませてきました:

JscksonはデシリアライズしますBが、以下を爆撃しCます:

BCは両方とも のサブクラスであるAため、setter がありgetNameます。の大文字は意図的なものであることに注意してくださいNNameこれが私の JSON の外観です。Deserializing はUnrecognized field nameについてC不平を言います。それは問題ないからです。NameB

バージョン 1.7.2

ObjectMapper mapper = new ObjectMapper();
mapper.getDeserializationConfig().addMixInAnnotations(B.class, MixIn.class);
String json = "{\"Name\" : \"13\"}";
B b = m.readValue(json, B.class);
System.out.println(b.getName());
C c = m.readValue(json, C.class);
System.out.println(c.getName());

 public class A {
    private int id ;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

public class B extends A {
private String address;

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
    }
}

 public class C extends A {
    private String country;

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
 }

 @JsonAutoDetect(fieldVisibility = Visibility.NONE,setterVisibility=Visibility.ANY)
 abstract class MixIn  {

    @JsonProperty("Name")
    public abstract void setName(String name);

    @JsonProperty("Id")
    public abstract void setId(int id);

 }
4

2 に答える 2

2

これは、呼び出されたセッターに一致するデフォルトのJSONフィールド名setNamenameではなくであるためNameです。これは、Javaプロパティ名の規則です。

Bに対して一致するフィールド名を変更するミックスインを導入したため、逆シリアル化が機能しますsetName

ミックスインも紹介していただけませんCか?

于 2011-02-09T08:36:19.317 に答える
1

名前の大文字の注釈のみを B に追加しました。

mapper.getDeserializationConfig().addMixInAnnotations(B.class, MixIn.class);

C を機能させるには、C に対しても行う必要があります。

mapper.getDeserializationConfig().addMixInAnnotations(C.class, MixIn.class);
于 2011-02-09T10:13:57.597 に答える