【问题标题】:Overwrite field type in inheritance for GSON serialization覆盖 GSON 序列化继承中的字段类型
【发布时间】:2014-05-28 12:40:43
【问题描述】:

我想通过这些课程实现以下目标:

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: declares multiple JSON fields named data

我怎样才能实现它,同名的超类字段被忽略?我认为我需要提供一个shouldSkipField 实现,但我目前无法弄清楚逻辑。

【问题讨论】:

    标签: java json serialization deserialization gson


    【解决方案1】:

    我假设不应更改字段名称,并且 A 类不应知道其子级。而且我认为 Gson 仍然不支持 setter 注入。所以我看不出有任何方法可以用 Gson 做到这一点。因为据我所知,您不能覆盖 java 中的字段。但是 Jackson 确实支持 setter 注入,并且使用 Jackson 你可以很容易地做到这一点。只需覆盖 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 就可以实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-31
      • 2012-06-22
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多