如何使用gson序列化Pair的ArrayList

我正试图反序列化一个类型的对象

ArrayList<Pair<OuterData, ArrayList<InnerData>>>

其中OuterDataInnerData是使用gson的POJO。

我已经努力了,但是我无法做到。 我正进入(状态

java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap无法转换为v2015.oasis.pilani.bits.com.home.events.inner.InnerData

每当我尝试做new Gson().fromJson(json, type);

其中type是从TypeToken使用获得的

 new TypeToken<ArrayList<Pair<OuterData, ArrayList<InnerData>>>>(){}.getType() 

我虽然使用类型将解决我的问题,因为最初我不想使用它,但它没有。 任何帮助表示赞赏。

编辑:这里是OuterDataInnerData类(在kotlin中)

 data class InnerData(val name: String, val category: String, val categoryIcon: Int, val description: String, val rules: String, val time: String, val date: String, val venue: String, val notifyState: Boolean, val notifyTime: Int, val favouriteState: Boolean) data class OuterData(val heading: String, val color: Int) 

我只使用gson来序列化数据。 所以反序列化使用的是使用gson序列化的相同的json。

编辑2:序列化的JSON数据:这是使用gson的输出序列化

 [ { "first": { "color": -65281, "heading": "October 01" }, "second": [ { "category": "", "categoryIcon": 17301533, "date": "", "description": "sfd", "favouriteState": false, "name": "sdfds", "notifyState": false, "notifyTime": 0, "rules": "", "time": "", "venue": "" } ] }, { "first": { "color": -65281, "heading": "November 01" }, "second": [ { "category": "", "categoryIcon": 17301533, "date": "djfkd", "description": "klddjflk", "favouriteState": false, "name": "jkl", "notifyState": false, "notifyTime": 0, "rules": "", "time": "sdkjfk", "venue": "ldkfjf" } ] }, { "first": { "color": -16175867, "heading": "October 31" }, "second": [ { "category": "Event Category", "categoryIcon": 17301533, "date": "31-10-2017", "description": "Event Description", "favouriteState": false, "name": "Event name", "notifyState": false, "notifyTime": 0, "rules": "Events Rules", "time": "13:55", "venue": "Event Venue" }, { "category": "", "categoryIcon": 17301533, "date": "", "description": "", "favouriteState": false, "name": "dsf", "notifyState": false, "notifyTime": 0, "rules": "", "time": "", "venue": "" }, { "category": "", "categoryIcon": 17301533, "date": "", "description": "", "favouriteState": false, "name": "", "notifyState": false, "notifyTime": 0, "rules": "", "time": "", "venue": "" }, { "category": "", "categoryIcon": 17301533, "date": "", "description": "", "favouriteState": false, "name": "", "notifyState": false, "notifyTime": 0, "rules": "", "time": "", "venue": "" }, { "category": "", "categoryIcon": 17301533, "date": "", "description": "", "favouriteState": false, "name": "", "notifyState": false, "notifyTime": 0, "rules": "", "time": "", "venue": "" }, { "category": "", "categoryIcon": 17301533, "date": "", "description": "", "favouriteState": false, "name": "", "notifyState": false, "notifyTime": 0, "rules": "", "time": "", "venue": "" }, { "category": "", "categoryIcon": 17301533, "date": "", "description": "", "favouriteState": false, "name": "", "notifyState": false, "notifyTime": 0, "rules": "", "time": "", "venue": "" }, { "category": "", "categoryIcon": 17301533, "date": "", "description": "", "favouriteState": false, "name": "", "notifyState": false, "notifyTime": 0, "rules": "", "time": "", "venue": "" }, { "category": "", "categoryIcon": 17301533, "date": "", "description": "", "favouriteState": false, "name": "", "notifyState": false, "notifyTime": 0, "rules": "", "time": "", "venue": "" } ] }] 

我试过你的代码,它的工作原理:

 import com.google.common.base.Charsets; import com.google.common.io.Resources; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.List; public class App { public static void main(String[] args) throws Exception { Gson gson = new Gson(); final Type type = new TypeToken<List<Pair<OuterData, List<InnerData>>>>() {}.getType(); final List<Pair<OuterData, List<InnerData>>> o = new Gson().fromJson(Resources.toString(Resources.getResource("foo.json"), Charsets.UTF_8), type); System.out.println(gson.toJson(o)); System.out.println(o.get(0).getFirst().getColor()); } static class Pair<F, S> { F first; S second; public F getFirst() { return first; } public void setFirst(F first) { this.first = first; } public S getSecond() { return second; } public void setSecond(S second) { this.second = second; } } static class OuterData { String heading; Integer color; public String getHeading() { return heading; } public void setHeading(String heading) { this.heading = heading; } public Integer getColor() { return color; } public void setColor(Integer color) { this.color = color; } } static class InnerData { String name; String category; Integer categoryIcon; String description; String rules; String time; String date; String venue; Boolean notifyState; Integer notifyTime; Boolean favouriteState; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public Integer getCategoryIcon() { return categoryIcon; } public void setCategoryIcon(Integer categoryIcon) { this.categoryIcon = categoryIcon; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getRules() { return rules; } public void setRules(String rules) { this.rules = rules; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getVenue() { return venue; } public void setVenue(String venue) { this.venue = venue; } public Boolean getNotifyState() { return notifyState; } public void setNotifyState(Boolean notifyState) { this.notifyState = notifyState; } public Integer getNotifyTime() { return notifyTime; } public void setNotifyTime(Integer notifyTime) { this.notifyTime = notifyTime; } public Boolean getFavouriteState() { return favouriteState; } public void setFavouriteState(Boolean favouriteState) { this.favouriteState = favouriteState; } } } 

输出是:

 [{"first":{"heading":"October 01","color":-65281},"second":[{"name":"sdfds","category":"","categoryIcon":17301533,"description":"sfd","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false}]},{"first":{"heading":"November 01","color":-65281},"second":[{"name":"jkl","category":"","categoryIcon":17301533,"description":"klddjflk","rules":"","time":"sdkjfk","date":"djfkd","venue":"ldkfjf","notifyState":false,"notifyTime":0,"favouriteState":false}]},{"first":{"heading":"October 31","color":-16175867},"second":[{"name":"Event name","category":"Event Category","categoryIcon":17301533,"description":"Event Description","rules":"Events Rules","time":"13:55","date":"31-10-2017","venue":"Event Venue","notifyState":false,"notifyTime":0,"favouriteState":false},{"name":"dsf","category":"","categoryIcon":17301533,"description":"","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false},{"name":"","category":"","categoryIcon":17301533,"description":"","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false},{"name":"","category":"","categoryIcon":17301533,"description":"","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false},{"name":"","category":"","categoryIcon":17301533,"description":"","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false},{"name":"","category":"","categoryIcon":17301533,"description":"","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false},{"name":"","category":"","categoryIcon":17301533,"description":"","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false},{"name":"","category":"","categoryIcon":17301533,"description":"","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false},{"name":"","category":"","categoryIcon":17301533,"description":"","rules":"","time":"","date":"","venue":"","notifyState":false,"notifyTime":0,"favouriteState":false}]}] -65281 

我知道了。 问题是我正在使用kotlin的Pair类。 只要我定义了我自己的简单的Pair类,一切正常。