如何使用GSON有效地延迟加载JSON文件的特定元素?

时间:2015-12-10 18:14:31

标签: java android json serialization gson

我有一个使用GSON编组到自定义对象中的JSON文件 一切正常。
我有一个结构的例子:

public class Domain {    
   private String id;  
   private String name;  
   //other fields  
   private ArrayList<Structures> structs;  
   private ArrayList<Buildings> buildings;   
   private ArrayList<CustomObject> objects;  
   // some more lists and fields  
}    

所以基本上我创建了一个构建器并解析了json

Gson gson = new GsonBuilder().create();  
gson.fromJson(jsonString, Domain.class);  

这绝对没问题。解析已完成,我得到了我的数据。

问题:
我不需要从一开始就填充Domain类的各个字段,例如我可能在Domain类中有很多元素。 structs的列表,但我可能不需要访问它们 我需要做的是延迟加载的某种模式 即我希望在json解析期间加载类的某些部分,并且只在需要时加载它们。

问题:
如果我理解正确,那么从解析中跳过字段的方法就是将它们变为瞬态 但是如果稍后我需要访问例如structs我将如何实际加载它们?我认为再次重新加载/重新调整所有json是不理想的。

对此有什么标准/好方法?

1 个答案:

答案 0 :(得分:1)

这是一个非常冗长的话题。有很多方法,所有这些方法通常要复杂得多。最简单的一个,如果你真正重视一些非常简单的东西,到目前为止还没有使用gson,但是比如像JSONObject这样的东西,然后自己填充对象。使用此功能,您可以轻松将其拆分为多个步骤。现在出现的问题是,你永远不会知道,究竟已经加载了什么 - 或者更多 - 什么是可能加载的,但只是没有作为一个字段填充。

遗憾的是,使用像gson这样的自动转换进行延迟加载也总是会涉及不必要的对象创建,所以问题就是如果它从一开始就自己做就不那么痛苦了。

如果必须是gson,你可以为不同的阶段提供不同的对象。通过json读取它们,然后应用到主要对象。

一个有利的版本可能是将对象拆分为与不同加载阶段匹配的不同组件(或方面或任何您想要调用的方式)。不同的可能性,但我们只选择其中一个:

class Domain {
    private String id;
    private DomainStructs domainStructs;
}

class DomainStructs {
    private ArrayList<Structures> structs;  
}

现在,在此版本中您需要一个新的Object。这意味着模型的总体尺寸略微(但实际上并不多),你可能应该将所有必要的东西匹配在一起 - 所以不要将每个字段分开加载,但这样你就可以省去零件并在以后轻松添加它们通过在Gson中填充它们,如下所示:

Gson gson = new GsonBuilder().create();  
Domain domain = gson.fromJson(jsonString, Domain.class);  // first time

domain.structs = gson.fromJson(jsonString, DomainStructs.class); // now adding

我并不是说这是最好的想法,但它仍然在使用gson时实现了你的想法。

我会考虑分割数据 - 所以不要存储字符串,但如果可能的话,在这种情况下将数据保存在不同的组件中。基本上你想要一个domainJsonString和一个domainStructsJsonString,如果你明白我的意思。以某种方式存储,以便您可以轻松地单独检索它们。

我希望这可以帮助你前进一点