[英]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.