我这几个小时以来一直在摸不着头脑:
Jsckson反序列化B
,但在下面的C
投反对票:
B
和C
都是A
的子类,因此有一个setter getName
。
请注意,N
中的大写Name
是有意的,这就是我的JSON外观。
反序列化C
抱怨无法识别的字段名称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);
}
答案 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);