[英]ClassCastException with Gson and class inheritance from generic ArrayList
我在使用 Gson 解析与 Json 之间的自定义类实例时遇到问题。 这是我正在处理的代码的简化版本:
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
import java.util.Arrays;
class IntegerArrayList extends ArrayList<Integer> {
public static IntegerArrayList fromJson(String json) {
TypeToken<IntegerArrayList> integerArrayListTypeToken = new TypeToken<IntegerArrayList>() {} ;
IntegerArrayList integerArrayList = new GsonBuilder()
.enableComplexMapKeySerialization()
.create()
.fromJson(json, integerArrayListTypeToken.getType());
return integerArrayList;
}
public String toJson() {
TypeToken<IntegerArrayList> integerArrayListTypeToken = new TypeToken<IntegerArrayList>() {};
return new GsonBuilder()
.enableComplexMapKeySerialization()
.setPrettyPrinting()
.create()
.toJson(this, integerArrayListTypeToken.getType());
}
public IntegerArrayList(Integer... items) {
super();
addAll(Arrays.asList(items));
}
}
public class GsonTest {
public static void main(String[] args) {
IntegerArrayList integerArrayList = new IntegerArrayList(1, 2, 3, 4, 5);
String json = integerArrayList.toJson();
IntegerArrayList integerArrayList1 = IntegerArrayList.fromJson(json);
}
}
我收到此错误:
Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList cannot be cast to IntegerArrayList
at IntegerArrayList.fromJson(GsonTest.java:13)
at GsonTest.main(GsonTest.java:36)
所以这里的问题是,它不是返回一个 IntegerArrayList 实例,而是返回它继承自的 ArrayList。
有没有机会直接从 Gson 获得 IntegerArrayList? 如何?
提前非常感谢!
好的,我刚刚编写了一个自定义适配器,它工作正常。 但是,实际代码会有些复杂,但是至少我知道谁可以解决这个问题。
这是代码:
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
class IntegerArrayList extends ArrayList<Integer> {
String customField = "test";
public IntegerArrayList(Integer... items) {
super();
addAll(Arrays.asList(items));
}
public static IntegerArrayList fromJson(String json) {
IntegerArrayList integerArrayList = new GsonBuilder()
.registerTypeAdapter(IntegerArrayList.class, new JsonAdapter())
.enableComplexMapKeySerialization()
.create()
.fromJson(json, IntegerArrayList.class);
return integerArrayList;
}
public String toJson() {
return new GsonBuilder()
.registerTypeAdapter(IntegerArrayList.class, new JsonAdapter())
.enableComplexMapKeySerialization()
.setPrettyPrinting()
.create()
.toJson(this, IntegerArrayList.class);
}
public static class JsonAdapter extends TypeAdapter<IntegerArrayList> {
@Override
public void write(JsonWriter out, IntegerArrayList value) throws IOException {
out.beginObject();
out.name("customField").value(value.customField);
out.name("items");
out.beginArray();
for (Integer v : value) {
out.value(v);
}
out.endArray();
out.endObject();
}
@Override
public IntegerArrayList read(JsonReader in) throws IOException {
IntegerArrayList rtn = new IntegerArrayList();
in.beginObject();
while (in.hasNext()) {
switch (in.nextName()) {
case "customField":
rtn.customField = in.nextString();
break;
case "items":
in.beginArray();
while (in.hasNext()) {
rtn.add(in.nextInt());
}
in.endArray();
}
}
in.endObject();
return rtn;
}
}
}
public class GsonTest {
public static void main(String[] args) {
IntegerArrayList integerArrayList = new IntegerArrayList(1, 2, 3, 4, 5);
String json = integerArrayList.toJson();
IntegerArrayList integerArrayList1 = IntegerArrayList.fromJson(json);
}
}
ClassCastException<\/code>是由
Gson 中的错误<\/a>引起的,该错误导致它创建标准 JDK 集合实例,即使它们与反序列化类型不兼容。
但是,这里的根本问题(一旦 Gson 错误修复后仍然存在)是您的
IntegerArrayList<\/code>类没有无参数构造函数。
因此 Gson 无法创建您的类的实例。
您可以通过添加无参数构造函数(
IntegerArrayList() { ... }<\/code> ,可见性无关紧要)或注册
InstanceCreator<\/code><\/a>来解决此问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.