0

我正在阅读一家公司提供的 API,但问题是我从中获取数据的帐户之一有大约 22000 个 json 对象,它可以读取少量数据,我会说最多 8000 条记录,但是除了能够读取响应的问题之外,我还遇到了诸如 json 格式不正确的问题。

响应是这样的:

 <?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://ywers.com">
[{"Name":"Edward", "LastName":"Jones", "Address":"{accepted}"}
,{"Name":"Carlos",  "LastName":"Ramirez", "Address":"{Rejected}"}, ....... 22k more records here]</string>

我早些时候在这里寻求一些帮助以获得最好的方法,我得到了关于使用 xml 解析器和 json 解析器读取它的响应,我正在使用 GSON。

String XML = "<Your XML Response>";
XPathExpression xpath = XPathFactory.newInstance()
                         .newXPath().compile("/*[local-name()='string']");
String json = xpath.evaluate(new InputSource(new StringReader(XML)));

进而

JSONArray jsonRoot = new JSONArray(json.trim());
System.out.println(jsonRoot.getJSONObject(0).getString("Address")); // {accepted}

我遇到的问题是它在读取 XML 时抛出错误,它开始读取,但过了一会儿它停止并出现以下错误:

java.lang.OutOfMemoryError
at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractBuilder.java:94)
at java.lang.StringBuffer.append(StringBuffer.java:219)
at org.apache.harmony.xml.dom.CharacterDataImpl.appendData(CharacterDataImpl.java:43)
......

我将不胜感激有关如何进行此操作的任何建议,我对 android 有点陌生。

4

1 回答 1

0

我不知道谁会将 22k 对象包装在 xml 字符串中,但显然有人正在这样做。根据我的经验,您的内存不足是因为您尝试将所有响应转换为字符串,但响应太大而无法处理。我建议您流式传输 JSON 数据。您可以从从 HTTP 帖子获得的输入流响应流式传输 JSON 数据,但您需要通过从原始响应输入流创建另一个输入流并跳过 XML 部分来跳过 XML 部分

在我使用来自 google GSON 的流式 API 之前,我也遇到了 OOM 错误,因为我得到的 JSON 数据是非常大的数据(许多图像和声音采用 Base64 编码)但是使用 GSON 流式我可以克服这个错误,因为它读取每个令牌的数据不是一次全部。作为替代方案,您还可以使用 Jackson JSON 库,我认为它也具有流式 API,以及如何使用它与我在 google GSON 中的实现几乎相同。我希望我的回答可以帮助您,如果您对我的回答有其他问题,请随时在评论中提问:)

于 2013-08-20T04:01:03.787 回答