重用已经由Gson解析的实例化对象

时间:2017-06-06 02:20:21

标签: java android json gson

我正在使用gson库来解析具有以下结构的json对象:

{
    "data" : [
        {
            "id" : 1,
            "type" : "student",
            "name" : "Student 1",
            "subjects" : [
                {
                    "id": 1,
                    "type" : "subject"
                }
            ]
        },
        {
            "id" : 2,
            "type" : "student",
            "name" : "Student 2",
            "subjects" : [
                {
                    "id": 1,
                    "type" : "subject",
                    "name" : "Math"
                }
            ]
        },
        {
            "id" : 3,
            "type" : "office",
            "name" : "student 3",
            "subjects" : [
                {
                    "id": 1,
                    "type" : "subject",
                    "name" : "History"
                },
                {
                    "id": 2,
                    "type" : "subject",
                    "name" : "History"
                }
            ]
        }
    ]
}

这是一个非常基本的例子,有3名学生协助0或许多班级。正如您所看到的,两个或更多学生可以对特定主题具有相同的引用,但是当我解析该对象时,学生1将具有主题1的对象,学生2将具有不同的对象但具有与该对象相同的信息。学生1,所以我的问题基本上是,有没有办法重用已经创建的对象?在这种情况下,有多个引用不是问题,但是说你有更多的对象,这将变成一个内存问题。

理论上我想到的是,在创建一个对象实例之前,应该有某种类型的池,所以我看看使用id和type,如果我找到了返回它的对象,否则我让解析器创建我的实例。有JsonDeserializer接口,但是使用JSON反序列化上下文存在一个已知问题,我也不能在其中执行新的Gson(),因为我的主要Gson有一些我想要重用的反序列化器和策略。我可以重新创建gson,但我不认为这是理想的,应该有更好的方法。

另外,我已经有一个TypeAdapter,它最初预处理来自服务器的JSON,基本上它删除了一些属性并添加了其他一些导致示例,但我无法检查每个单独的对象,如JsonDeserializer会做

我将不胜感激任何帮助或想法。

1 个答案:

答案 0 :(得分:0)

你可以做的一种方法是展平结构。即你可以跳过在学生对象中发送整个主题对象。

例如,学生对象:

"student": [
    {
        id: "1234567890",
        name: "Bhalchandra Wadekar",
        subject: [
            "CS4040",
            "CS4010"
        ]
    }
]

其中,CS40​​40和CS4010是各个科目的标识符。

主题对象:

"subject": [
    {
        id: "CS4040",
        name: "Mobile Design and Development"
    },
    {
        id: "CS4010",
        name: "Major Project"
    }
]

使用此方法的好处是:

  1. 减少您在个别请求中收到的数据量,从而导致更快的响应时间。
  2. 每个主题的内存中的单个对象。因此,无论有多少学生帮助该主题,您都将创建并使用一个对象。