如何最好地处理JSON对象?

4
我是一位能够翻译文本的助手。

我有一个大字符串,代表着JSON源。我的应用会从远程网络服务下载这个源。

问题:

1)当我下载JSON源后,应该把它放在哪里?目前我将其存储在应用程序首选项中,这样做很好用。只是我想知道是否有任何理由不这么做,或者是否有更好/更快的选择,比如内部存储或其他什么东西?

2)当我要在我的activity中显示来自这个源的数据时,我会这样做:

JSONObject jsonObj = new JSONObject(json_string);
JSONArray jsonArr = jsonObj.getJSONArray("root");
for (int m = 0; m < jsonArr.length(); m++) {
    ....
}

问题是,解析JSON源的第一行代码有点费时。在我的目前大小的源(可能会增长)中,它需要大约半秒钟才能完成,虽然不多,但仍然是一个问题。例如,我点击按钮调用活动(以显示数据),这个1/2秒的暂停是明显的,不好的。

为了避免这种暂停,我应该在下载源后立即解析JSON。那么问题是,我应该把解析后的JSON对象存储在哪里?

i)我不能将JSON对象保存到首选项中,因为只能存储基本数据。

ii)我应该在每次启动应用程序时进行解析,并使我的解析后的JSON对象(我有更多)全局(在应用程序级别)以便我可以从所有活动中访问它们吗?

iii)或者,我相信我的第三个选择是声明JSON对象静态,以便可以轻松地从其他活动中访问它们?

哪种方法最好?

谢谢。

3个回答

3
如果速度是一个真正的问题,那么一个简单的方法来显著加快解析(以及写出)JSON数据的速度就是使用Jackson来解析JSON数据。与org.json库(Android SDK附带的库)相比,如果您只想解析为Maps或Lists,它至少要快3-5倍(http://www.cowtowncoder.com/blog/archives/2009/02/entry_204.html)。但如果您可以将其绑定到Java对象上,它会更快,并且使用的内存也更少。
如果您想保存JSON数据,通常只需将其序列化为文件或数据库中的BLOB;但除非您真的需要,否则最好只保留从JSON数据创建的Java对象。

谢谢。如果我将JSON对象序列化并保存数据到文件中,然后稍后需要加载并反序列化它,您认为这样做会比从首选项(JSON源)检索字符串并执行JSONObject jsonObj = new JSONObject(json_string)更快吗? - bobetko
我不熟悉偏好设置界面;我只是在说,JSONObject使用的解析器很慢,有更快的替代方案。无论JSON如何存储(存储的字节,字符串,通过网络读取),这都是如此。 - StaxMan

1

你需要存储它吗?如果你只需要从网页下载一次,那么将其存储在共享首选项中就可以了。如果你需要频繁获取它,为什么还要存储它呢?你也可以将其存储在缓存目录中。


我需要存储它,因为我不想每次启动我的应用程序时都要加载它。正如我所说,我将其存储为字符串。我希望能够将其存储为JSON对象,以避免解析JSON字符串所花费的时间。 - bobetko
如果JSON对象不能按原样存储(以便我可以从任何一个活动中调用它),那么使JSON对象在整个应用程序中可用的最佳方法是什么? - bobetko
解析JSON对象所需的时间微不足道。您认为如何将其保存为对象?它必须被序列化。将其序列化为JSON是完全有效的。 - Falmarri
哦,你的意思是将对象存储起来,以便在多个活动中访问数据?看一下这个链接:http://developer.android.com/guide/appendix/faq/framework.html#3 - Falmarri

1

1
谢谢Elevine。在我的上一个应用程序(我的第一个)中,我使用了这种方法。我会解析源,将它们存储到SQLite数据库中,然后使用DB数据来填充我的控件。这需要一些额外的工作,但一切都很顺利。在和我的朋友(一位iPhone程序员)交谈后,他告诉我这个数据库层是不必要的,我可以直接使用源进行操作。因此,我决定在下一个项目中尝试并亲自看看。 - bobetko
1
如果您不需要持久化数据,那么您可能不需要采用数据库方法。 - Eric Levine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接