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



我有一个JSON文件,它使用GSON整理成自定义对象
一切都很好
我有一个结构的例子:

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类的各个字段,因为例如,我可能在structs的例如列表中有很多元素的Domain类,但我可能不需要访问它们
我需要做的是为懒惰加载创建某种模式
也就是说,在json解析过程中,我希望不要加载类的某些部分,只在需要时加载它们。

问题:
如果我理解正确的话,跳过解析字段的方法就是使它们成为瞬态的
但是,如果在以后的某个时间我需要访问例如structs,我将如何在那时实际加载它们?我认为重新加载/重新准备所有json是次优的。

什么是标准/良好的方法?

这是一个非常冗长的主题。有很多方法可以做到这一点,而所有这些方法通常都要复杂得多。如果你真的很看重对我来说非常简单的东西,那么最简单的一个就是到目前为止不使用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。以便于单独检索的方式存储。

我希望这能帮助您向前推进

最新更新