2017-06-06 42 views
1

解析重用已经实例化对象我使用GSON库来解析具有以下结构的JSON对象:通过GSON

{ 
    "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或很多班。正如你所看到的,2个或更多的学生可以有一个特定的主题相同的引用,但是当我解析对象时,学生1将有一个主题1的对象,学生2将有一个不同的对象,但具有相同的信息学生1,所以我的问题基本上是,有没有办法重用已经创建的对象?在这种情况下,有多个引用不是问题,但是说你有更多的对象,这将变成一个内存问题。

理论上想到的是,在创建一个对象实例之前,应该有某种类型的池,所以我使用id和type,如果找到了我返回的对象,否则我让解析器去为我创建实例。有JsonDeserializer接口,但是使用JSON反序列化上下文存在一个已知问题,我也不能只在它内部做一个新的Gson(),因为我的主Gson有一些我想要重用的反序列化器和策略。我可以重新创建gson,但我不认为这是理想的,应该有更好的方法。另外,我已经有了一个TypeAdapter,它最初对来自服务器的JSON进行了预处理,基本上它删除了一些属性并在示例中添加了一些其他属性,但是我无法检查每个单独的对象,如JsonDeserializer会做

我会很感激任何帮助或想法。

+0

您的主题共享不同类别的相同ID。您的示例数据中是否存在拼写错误? +办公室也是一个错字吗? –

+0

@LyubomyrShaydariv对不起,这是一个错字 –

回答

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. 内存中的每个主题的单个对象。因此,无论有多少学生协助该主题,您都将创建并使用一个对象。
+0

这实际上是服务器返回的,但基本上我需要添加一个函数来搜索每种类型,当我需要它们时,这会增加代码的复杂性,每当我传递我需要添加代码以查找实际对象的参考数组 –

+0

地图可以解决寻找给定标识符的主题的问题。 :) – BhalchandraSW