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就可以实现类似的功能