【问题标题】:Reading lots of data returned by API读取 API 返回的大量数据
【发布时间】:2013-08-20 03:32:30
【问题描述】:

我正在从一家公司提供的 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 有点陌生。

【问题讨论】:

  • 找到用 XML 封装了 22k 元素的 JSON 数组的人(并且作为奖励在 一个元素中),然后射击他们。你会很难处理的。
  • 应提供范围查询API。
  • 我知道...多么痛苦...
  • 同意@BrianRoach。设计 Api 的人应该实现索引和限制。即使您没有收到 OutOfMemoryError,您也会遇到问题。
  • 在这种情况下,是否可以使用正则表达式来解析属性,因为这里的json结构很简单。

标签: java android xml json


【解决方案1】:

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

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

【讨论】:

  • 这听起来像是一个计划,如果你不介意我问,我怎么能跳过那个 xml。
猜你喜欢
  • 2011-11-28
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多