Android:解析大型JSON文件

时间:2012-06-19 15:20:27

标签: android json parsing jackson

我正在创建一个Android应用程序,它应该将Json从文件或url解析为jsonarray和jsonobjects。 问题是我的json是3.3 MB,当我使用一个简单的代码时,就像这样:(现在可以访问我的真实代码,因为我正在工作,从教程中复制了一些代码;所以可能会有一些错误它)

(假设我已经拥有输入流内容)

InputStream content = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(content));
                String line;
                while ((line = reader.readLine()) != null) {
                    builder.append(line);
String twitterfeed = builder.toString();
}

JSONArray jsonArray = new JSONArray(twittefeed);
            Log.i(ParseJSON.class.getName(),
                    "Number of entries " + jsonArray.length());
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                Log.i(ParseJSON.class.getName(), jsonObject.getString("text"));

当我在我的Android设备上运行此代码时,在将字符串解析为jsonArray时出现OutOfMemory错误。 我记录了一些东西,我发现我的总字符串是17 MB(一个3.3 MB的json文件?!)当我使用一个小的json文件,如twitterfeed左右,代码工作正常。 当我在我的记忆中得到这个17 MB的字符串时,我无法解析json,因为那时我的内存不足。

经过大量研究后,我发现杰克逊可能是我的解决方案,因为我知道可以解析输入流。这应该有所帮助,因为我不需要记忆中的17 mb字符串;这不是我认为最有效的方式....但是我无法明白这一点确实会起作用,并且没有让它自己运行。 有谁知道这真的会起作用,我可以找到一个教程吗?

我找到"createJsonParser -- public JsonParser createJsonParser(InputStream in)"并认为这是我要走的路......但我不知道如何在我的代码中实现这一点,并且无法找到一个例子。有谁知道这是如何工作的?

2 个答案:

答案 0 :(得分:7)

你应该使用gson或者gson或者jackson。有了Jackson,您也可以使用混合方法。这会显着减少你的内存消耗,因为只有被解析的json部分被加载到内存中。

https://sites.google.com/site/gson/gson-user-guide http://jackson.codehaus.org/

杰克逊示例http://www.mkyong.com/java/jackson-streaming-api-to-read-and-write-json/

答案 1 :(得分:0)

与杰克逊的hybrid streaming approach是一个不错的选择。这样,您可以通过原始JSON输入前进一个指针(随时验证它),并且当您检测到需要处理的输入块时,您可以将其读入树层次结构,以便您可以拉出任何你想要的数据。