Java Jackson JSON处理器问题
几个小时以来,我一直在为这件事挠头: Jsckson反序列化Java Jackson JSON处理器问题,java,json,jackson,Java,Json,Jackson,几个小时以来,我一直在为这件事挠头: Jsckson反序列化B,但在下面的C上爆炸: B和C都是A的子类,因此有一个settergetName。 请注意,Name中的大写字母N是故意的,这就是我的JSON的外观。 反序列化C会抱怨无法识别的字段名name,对于B,这是正常的 版本1.7.2 ObjectMapper mapper = new ObjectMapper(); mapper.getDeserializationConfig().addMixInAnnotations(B.class,
B
,但在下面的C
上爆炸:
B
和C
都是A
的子类,因此有一个settergetName
。
请注意,Name
中的大写字母N
是故意的,这就是我的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());
这是因为与名为
setName
的setter匹配的默认JSON字段名是name
,而不是name
。这是Java属性名约定
反序列化适用于B
,因为您引入了mixin,它改变了与setName
匹配的字段名
你不能也为
C
引入mixin吗?你只在B中添加了大写注释
mapper.getDeserializationConfig().addMixInAnnotations(B.class, MixIn.class);
要让C工作,你也需要为C工作
mapper.getDeserializationConfig().addMixInAnnotations(C.class, MixIn.class);
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);
}
mapper.getDeserializationConfig().addMixInAnnotations(B.class, MixIn.class);
mapper.getDeserializationConfig().addMixInAnnotations(C.class, MixIn.class);