读取API返回的大量数据

时间:2013-08-20 03:32:30

标签: java android xml json

我正在阅读一家公司提供的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有点新鲜。

1 个答案:

答案 0 :(得分:0)

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

在我使用谷歌GSON的流媒体API之前我也有OOM错误,因为我得到的JSON数据是非常大的数据(Base64编码中的许多图像和声音)但是使用GSON流我可以克服该错误,因为它读取数据每个令牌不是一次全部。另外你也可以使用Jackson JSON库我认为它也有流API,以及如何使用它与谷歌GSON的实现几乎相同。我希望我的回答可以帮助你,如果你对我的回答有另一个问题,请随时在评论中提问:)