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

标签 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 个或多个类(class)。如您所见,2 个或更多学生可以对特定主题具有相同的引用,但是当我解析该对象时,学生 1 将有一个主题 1 的对象,学生 2 将有一个不同的对象,但与用于的对象具有相同的信息学生 1,所以我的问题基本上是,有没有办法重用已经创建的对象?在这种情况下,拥有多个引用不是问题,但是假设您有更多的对象,这将变成内存问题。

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

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

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

最佳答案

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

例如学生对象:

"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. 每个科目在内存中有一个对象。因此,无论有多少学生协助该科目,您都将创建和使用一个对象。

关于java - 重用 Gson 解析的已经实例化的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44380404/

相关文章:

java - 从 REST 服务器解析 JSON

android - 为什么 androidx.preference 库会阻止我的自定义复选框正常显示?

javascript - eBay Finding API - 为什么 findItemsAdvanced JSON 结果元素都是数组?

java - 如何在 openGL 中制作光球?

java - OffsetDateTime 格式化和解析

android - 在远程 View 通知中更改 Imageview 资源

android - 亚马逊 java.lang.VerifyError Android

ios - 如何让 NSJSONSerialization 将 boolean 值输出为真或假?

java - 通过反射(reflection)思考工厂设计模式

java - java中的代码解释