杰克逊JSON处理器问题

时间:2011-02-09 07:52:10

标签: java json jackson

我这几个小时以来一直在摸不着头脑:

Jsckson反序列化B,但在下面的C投反对票:

BC都是A的子类,因此有一个setter getName。 请注意,N中的大写Name是有意的,这就是我的JSON外观。 反序列化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);

 }

2 个答案:

答案 0 :(得分:2)

这是因为与名为setName的setter匹配的默认JSON字段名称是name,而不是Name。这是Java属性名称约定。

反序列化适用于B,因为您已经引入了改变与setName匹配的字段名称的mixin。

你不能只为C介绍mixin吗?

答案 1 :(得分:1)

您只将名称 - 大写注释添加到B。

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

要让C工作,你也需要为C做。

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