一尘不染

Android:解析大型JSON文件

json

我正在创建一个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-公共JsonParser createJsonParser(InputStream
in)”,
并认为这是我要走的路…但是我不知道如何在我的代码中实现它,并且找不到示例。有谁知道这是如何工作的?


阅读 568

收藏
2020-07-27

共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/

2020-07-27