解析大型JSON字符串时出现内存溢出错误。
我见过几个使用GSON来流式处理大型JSON文档的例子,但我的问题是,我的JSON文档没有数百或数千行可以有效地标记化的“行”。它只包含一个base64节点,数据量约为15MB,例如。
{
"id":"somefile",
"base64":"super long base64 string...."
}
如何将JSON文档中的单个base64字符串解析为文件并保存到文件系统,而不耗尽内存?使用StringBuilder将base64节点解析为字符串是导致当前OOM错误的原因。例如
...
InputStream is = con.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line); //out of memory
}
reader.close();
//parse the response into a POJO
MyFileClass f = new Gson().fromJson(sb.toString(), MyFileClass.class);
我不建议你通过json下载大文件。但是,如果您真的想要这样做,那么应该在AndroidManifest中的应用程序标记上添加以下属性。xml:
<application
android:largeHeap="true">
. . .
</application>
看来我找到了解决办法。在使用GSON之前,似乎不需要将JSON解析为字符串。您可以将InputStream
直接传递给GSON,如下例所示(与问题中的代码进行比较):
InputStream is = con.getInputStream();
BufferedReader buff_reader = new BufferedReader(new InputStreamReader(is));
//use GSON to create a POJO directly from the input stream
MyType instance = new Gson().fromJson(buff_reader, MyType.class);
我不完全确定是否需要使用BufferedReader,因为fromJSON
方法将直接接受InputStreamReader
,但这似乎是个好主意。
问题内容: 我通常使用以下代码来解析JSON字符串: 当数据如下所示时,效果很好: 突然之间,当输入其他数据时,我遇到了问题。解析失败,并且在调试时,我发现该字符串如下所示: 显然,我得到双引号内的JSON字符串。2个简短的问题:1)这是否正常,并且JSONObject应该能够解析它吗?2)如果不是,建议的处理方式是什么? 问题答案: 这似乎是JSON生成中的错误。JSON实际上应该在此处引发解析
问题内容: 如何在Android中解析Json字符串数组并将其保存在Java字符串数组中(例如:xy [])? 我要解析的Json: 稍后在我的代码中,我想用该数组填充布局中的微调项。我尝试过的所有内容都只包含微调框中列出的一个街头商品。 问题答案: 解析 一旦解析并将其添加到数组。使用相同的控件来填充微调框。 表示json数组节点 表示json对象节点
问题内容: 解析JSON似乎是这里讨论的一个相当普遍的话题。我环顾四周,但仍然找不到我想要的东西。这是我的HttpClient的代码 我正在使用HttpClient将JSON请求发送到服务器。然后,服务器以JSON返回响应。这很好。现在这是我遇到麻烦的地方。我从服务器接收到HttpEntity。然后,我将其变成看起来像这样的字符串。 我希望能够将此字符串发送到我的方法,并且它返回键值映射。我觉得这
问题内容: 我正在尝试解析以下JSONString 这是我的代码: 有人可以帮忙,我的代码不起作用吗?我想解析标题,公司名称,类别等… 问题答案: 您需要从您的jsonstring 创建。 你有里面然后..
问题内容: 我有以下Json字符串 我正在尝试解析它并打印出每个名称和值-最简单的方法是什么?我尝试了jQuery.parseJSON但我不知道如何使用它 示例代码会很棒 问题答案: 结果是: jsFiddle示例:http://jsfiddle.net/bradchristie/XtzjZ/1/