Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson JSON处理器问题_Java_Json_Jackson - Fatal编程技术网

Java Jackson JSON处理器问题

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,

几个小时以来,我一直在为这件事挠头:

Jsckson反序列化
B
,但在下面的
C
上爆炸:

B
C
都是
A
的子类,因此有一个setter
getName
。 请注意,
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);