Java 如何使用继承项解析Json通用数组

Java 如何使用继承项解析Json通用数组,java,json,gson,deserialization,Java,Json,Gson,Deserialization,我的问题不一样。 如果我想解释,让我们假设我们有这些类(A,B,C) 我知道我想解析一个数组,它的基类是A。对于名为type的属性,我想将每个项转换为它的特定类。 类似这样的代码 public static void main(String[] args) { Gson gson = new Gson(); List<A> list = new ArrayList<>(); A a = new A("A", 0);

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

我知道我想解析一个数组,它的基类是A。对于名为type的属性,我想将每个项转换为它的特定类。 类似这样的代码

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的东西,并希望解析它。 但是当我运行代码y和z时,属性没有打印,对象不是B或C的实例。
如何实现这一目标,解析并创建具有type属性的每个项。

我通过Gson TypeAdapterFactory机制找到了解决方案。
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;
  }
}

创建一个类来实现com.google.gson.TypeAdapterFactory。有关更多详细信息,请参见此

,这不是因为您已将
列表
定义为
列表
——而不是像
列表这样的内容,因为您尝试使用类型属性标记类,所以我也会说,您应该能够使用[“type”]或者类似的东西,还有东西的实例-甚至可能是A.type-不确定Gson是如何工作的。不工作。java.lang.ClassCastException!当我们的对象不是B或C的实例时,绝对会发生这种异常!
@Data
class C extends A {
    private Integer z;

    public C(Integer x, Integer z) {
        super("C", x);
        this.z = z;
    }
}
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());

            }
        }
    }
[{"x":0,"type":"A"},{"y":2,"x":1,"type":"B"},{"z":4,"x":3,"type":"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;
  }
}