我正在使用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会做
我将不胜感激任何帮助或想法。
答案 0 :(得分:0)
你可以做的一种方法是展平结构。即你可以跳过在学生对象中发送整个主题对象。
例如,学生对象:
"student": [
{
id: "1234567890",
name: "Bhalchandra Wadekar",
subject: [
"CS4040",
"CS4010"
]
}
]
其中,CS4040和CS4010是各个科目的标识符。
主题对象:
"subject": [
{
id: "CS4040",
name: "Mobile Design and Development"
},
{
id: "CS4010",
name: "Major Project"
}
]
使用此方法的好处是: