1

我已经为此挠头好几个小时了:

Jsckson 反序列化B但炸弹在C下面:

BC都是 的子类A,因此有一个 setter getName。请注意,大写NName故意的,这就是我的 JSON 的外观。反序列化C抱怨 Unrecognized field name Name,因为B没关系。

版本 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 字段名称来匹配一个名为 的 setter setNamename而不是Name。这是 Java 属性名称约定。

反序列化之所以有效,是B因为您引入了 mixin 来更改匹配的字段名称setName

你不能只介绍mixinC吗?

于 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 回答