Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重用Gson解析的已实例化对象_Java_Android_Json_Gson - Fatal编程技术网

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

Java 重用Gson解析的已实例化对象,java,android,json,gson,Java,Android,Json,Gson,我正在使用gson库解析具有以下结构的json对象: { "data" : [ { "id" : 1, "type" : "student", "name" : "Student 1", "subjects" : [ { "id": 1, "type" : "subj

我正在使用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和类型查找,如果找到对象,我将返回它,否则我将让解析器为我创建实例。有JsonDeserializer接口,但是使用JSON反序列化上下文有一个已知的问题,而且我不能只在其中执行一个新的Gson(),因为我的主Gson有一些反序列化程序和策略,我想重用它们。我可以重新创建gson,但我认为这并不理想,应该有更好的方法

另外,我已经有了一个TypeAdapter,它最初对来自服务器的JSON进行预处理,基本上它删除了一些属性并添加了一些其他属性,从而生成了这个示例,但是我无法像JsonDeserializer那样检查每个单独的对象

我将非常感谢您在这方面的任何帮助或想法。

您可以做的一个方法是将结构展平。i、 e.您可以跳过在学生对象中发送整个主题对象

例如,学生对象:

"student": [
    {
        id: "1234567890",
        name: "Bhalchandra Wadekar",
        subject: [
            "CS4040",
            "CS4010"
        ]
    }
]
"subject": [
    {
        id: "CS4040",
        name: "Mobile Design and Development"
    },
    {
        id: "CS4010",
        name: "Major Project"
    }
]
其中,CS4040和CS4010是个体受试者的标识符

主题对象:

"student": [
    {
        id: "1234567890",
        name: "Bhalchandra Wadekar",
        subject: [
            "CS4040",
            "CS4010"
        ]
    }
]
"subject": [
    {
        id: "CS4040",
        name: "Mobile Design and Development"
    },
    {
        id: "CS4010",
        name: "Major Project"
    }
]
使用此方法的好处是:

  • 减少您收到的单个请求的数据量,从而缩短响应时间。
  • 每个科目的内存中只有一个对象。因此,无论有多少学生协助该科目,您都将创建和使用一个对象

  • 您的科目在不同的课程中共享相同的ID。您的示例数据中是否有输入错误?+
    office
    也是一个输入错误吗?@LyubomyrShaydariv抱歉,是的,这是一个输入错误这实际上是服务器返回的内容,但基本上我需要在需要时添加一个函数来搜索每种类型,这将增加代码的复杂性,每次我传递一组引用时,我都需要添加代码来查找真正的对象。地图可以解决为给定标识符查找主题的问题。:)