Java 如何使用继承项解析Json通用数组
我的问题不一样。 如果我想解释,让我们假设我们有这些类(A,B,C) 我知道我想解析一个数组,它的基类是A。对于名为type的属性,我想将每个项转换为它的特定类。 类似这样的代码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);
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;
}
}