如何解析具有继承项的 Json 泛型数组

How to Parse Json generic array with inheritance items

我的问题不一样 this question。 如果我想解释让我们假设我们有这些 classes (A, B, C).

@Data
@NoArgsConstructor
class A {
    private Integer x;
    private String type;

    public A(String type, Integer x) {
        this.type = type;
        this.x = x;
    }
}
@Data
class B extends A {
    private Integer y;

    public B(Integer x, Integer y) {
        super("B", x);
        this.y = y;
    }
}
@Data
class C extends A {
    private Integer z;

    public C(Integer x, Integer z) {
        super("C", x);
        this.z = z;
    }
}

知道我想解析一个数组,其基数 classes 是 A。并且使用 属性 命名类型我想将每个项目转换为其特定的 class。 类似于这段代码。

public static void main(String[] args) {
        Gson gson = new Gson();
        List<A> list = new ArrayList<>();
        A a = new A("A", 0);
        list.add(a);
        B b = new B(1, 2);
        list.add(b);
        C c = new C(3, 4);
        list.add(c);
        String serializedJson = gson.toJson(list);
        List<? extends A> deserializedList = gson.fromJson(serializedJson, new TypeToken<List<? extends A>>() {
        }.getType());
        for (A item : deserializedList) {
            System.out.println(item.getType());
            if (item instanceof B) {
                System.out.println(((B) item).getY());

            } else if (item instanceof C) {
                System.out.println(((C) item).getZ());

            }
        }
    }

序列化json是这样的

[{"x":0,"type":"A"},{"y":2,"x":1,"type":"B"},{"z":4,"x":3,"type":"C"}]

在现实世界中,我有这样的东西 json 并且想解析它。 但是当我 运行 时,代码 y 和 z 属性未打印并且对象不是 B 或 C 的实例。 如何实现此目标以解析和创建类型为 属性 的每个项目。

for(A item : deserializedList) {
  switch(item.getType()) {
    case "B":
      System.out.println(((B) item).getY());
    break;
    case "C":
      System.out.println(((C) item).getZ());
    break;
  }
}

我通过 Gson TypeAdapterFactory 机制找到了解决方案。 创建一个 class 来实现 com.google.gson.TypeAdapterFactory。有关详细信息,请参阅此 link