如何使用gson序列化Pair的ArrayList

时间:2017-10-21 09:18:28

标签: java android arraylist gson deserialization

我正在尝试反序列化

类型的对象

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()

我虽然使用Type会解决我的问题,因为我最初想要使用它,但它并没有。任何帮助表示赞赏。

编辑:以下是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。

Edit2:序列化的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": ""
        }
    ]
}]

2 个答案:

答案 0 :(得分:0)

我尝试了你的代码并且有效:

"use strict";

window.onload = function(){

  var o = {x:1};

  //Make "x" non-configurable
  Object.defineProperty(o, "x", {configurable: false});
  //Seal "o";
  Object.seal(o);

  console.log(Object.getOwnPropertyDescriptor(o, "x"));
  //outputs => Object { value: 1, writable: true, enumerable: true, configurable: false }
  console.log(Object.isSealed(o));
  //outputs => true

  Object.defineProperty(o, "x", {writable: false}); //this doesn't cause any errors.
  console.log(Object.getOwnPropertyDescriptor(o, "x"));
  //outputs => Object { value: 1, writable: false, enumerable: true, configurable: false }
}

输出结果为:

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;
        }
    }
}

答案 1 :(得分:0)

我明白了。问题是我使用的是kotlin的Pair类。一旦我定义了自己的简单Pair类,一切都正常。