我在用Gson解析一个自定义类示例时遇到了问题。这是我正在处理的代码的简化版本:
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?如何获得?
提前多谢了!
2条答案
按热度按时间oxcyiej71#
ClassCastException
是由bug in Gson引起的,该bug in Gson会导致它创建标准JDK集合示例,即使这些示例与反序列化的类型不兼容。然而,这里潜在的问题(Gson bug修复后仍然存在)是您的
IntegerArrayList
类没有无参数构造函数。因此Gson无法创建您的类的示例。您可以通过添加一个无参数构造函数(IntegerArrayList() { ... }
,可见性无关紧要)来解决这个问题,或者注册一个InstanceCreator
。cclgggtu2#
好的,我刚刚写了一个自定义的适配器,它工作的很好。虽然它会有一点复杂的真实的的代码,但至少我知道谁来解决这个问题。
下面是代码: