Reputation: 384
I am trying to deserialize an object of type
ArrayList<Pair<OuterData, ArrayList<InnerData>>>
where OuterData
and InnerData
are POJOs using gson.
I have tried so hard but I'm not able to do it. I am getting
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to v2015.oasis.pilani.bits.com.home.events.inner.InnerData
whenever I try to do new Gson().fromJson(json, type);
where type is obtained from TypeToken using
new TypeToken<ArrayList<Pair<OuterData, ArrayList<InnerData>>>>(){}.getType()
I though using Type will solve my problem as initially I want't using it but it didn't. Any help is appreciated.
Edit: Here are the OuterData
and InnerData
classes (In 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)
I am using gson only to serialize the data. So deserialization is using the same json serialized using gson.
Edit2 : Serialized JSON Data: It was the output serialization using 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": ""
}
]
}]
Upvotes: 4
Views: 3713
Reputation: 384
I got it. The problem was that I was using kotlin's Pair class. As soon as I defined my own simple Pair class, everything worked out correctly.
Upvotes: 1
Reputation: 3471
I tried your code and it works:
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;
}
}
}
The output is:
[{"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
Upvotes: 0