Vaibhav Maheshwari
Vaibhav Maheshwari

Reputation: 384

How to serialize ArrayList of Pair using gson

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

Answers (2)

Vaibhav Maheshwari
Vaibhav Maheshwari

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

Davide Patti
Davide Patti

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

Related Questions