【发布时间】:2018-03-13 10:49:13
【问题描述】:
我在使用 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?怎么样?
提前非常感谢!
【问题讨论】:
-
想解释一下否决票?
-
与此问题无关,但您可以通过调用
fromJson(json, IntegerArrayList.class)来简化fromJson(json, integerArrayListTypeToken.getType());。你打电话给enableComplexMapKeySerialization()有什么原因吗? Gson 默认将 Collections 序列化为 JSON 数组,因此设置不应该有任何影响。
标签: java generics inheritance gson