Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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 覆盖GSON序列化继承中的字段类型_Java_Json_Serialization_Deserialization_Gson - Fatal编程技术网

Java 覆盖GSON序列化继承中的字段类型

Java 覆盖GSON序列化继承中的字段类型,java,json,serialization,deserialization,gson,Java,Json,Serialization,Deserialization,Gson,通过本课程,我想了解以下内容: public class A { Data data; } public class A extends B { boolean data; } 当反序列化时,我想让以下语句起作用 new Gson().fromJson("{\"data\": "false\"}", B.class) new Gson().fromJson("{\"data\": {}}", A.class) 目前,当然它不起作用,得到一个 IllegalArgumentExc

通过本课程,我想了解以下内容:

public class A {
   Data data;
}

public class A extends B {
   boolean data;
}
当反序列化时,我想让以下语句起作用

new Gson().fromJson("{\"data\": "false\"}", B.class)
new Gson().fromJson("{\"data\": {}}", A.class)
目前,当然它不起作用,得到一个

IllegalArgumentException:声明多个名为data的JSON字段


我如何实现它,忽略同一个命名的超类字段?我认为我需要提供一个
shouldSkipField
实现,但我目前无法理解逻辑。

我认为字段的名称不应该更改,类不应该知道它的子类。我认为Gson仍然不支持setter注入。所以我看不出有什么办法可以用Gson做到这一点。因为正如我所知,您不能重写java中的字段。但杰克逊确实支持塞特注射,有了杰克逊,你可以很容易地做到这一点。只需覆盖getter和setter,并将它们标记为已忽略。要测试的代码:

public static void main(String[] args) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    B b = mapper.readValue("{\"data\": \"false\"}", B.class);
    A a = mapper.readValue("{\"data\": {\"id\":5}}", A.class);
    System.out.println(b);
    System.out.println(a);
}

public static class A{
    private Data data;

    public Data getData() {
        return data;
    }

    public void setData(Data data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "A{" +
                "data=" + data +
                '}';
    }
}

public static class B extends A{
    private boolean data;

    @JsonIgnore
    @Override
    public Data getData() {
        return super.getData();
    }

    @JsonIgnore
    @Override
    public void setData(Data data) {
        super.setData(data);
    }

    public boolean isData() {
        return data;
    }

    public void setData(boolean data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "B{" +
                "data=" + data +
                '}';
    }
}

public static class Data{
    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Data{" +
                "id=" + id +
                '}';
    }
}
我们的目标是:

B{data=false}
A{data=Data{id=5}}
如果Gson也支持setter注入,那么使用Gson就可以实现类似的功能