如何解析具有继承项的 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
我的问题不一样 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