【问题标题】:Android: Parsing large JSON fileAndroid:解析大型 JSON 文件
【发布时间】:2012-06-19 15:20:26
【问题描述】:

我正在创建一个 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,因为那时我的内存不足。

经过大量研究后,我发现 jackson 可能是我的解决方案,因为我知道解析输入流是可能的。这应该会有所帮助,因为我不需要记忆中的 17 mb 字符串;这不是我认为最有效的方式....但我无法弄清楚这真的会起作用,而且我自己也没有让它运行。 有谁知道这真的会起作用,我在哪里可以找到教程?

我找到了"createJsonParser -- public JsonParser createJsonParser(InputStream in)" 并认为这是我要走的路……但我不知道如何在我的代码中实现它,也找不到示例。有谁知道这是怎么回事?

【问题讨论】:

标签: android json parsing jackson


【解决方案1】:

您应该使用带有 gson 或 jackson 的 json 流。对于 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/

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      相关资源
      最近更新 更多