我正在从一家公司提供的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的新手。
我不知道是谁将22k对象包装在xml字符串中,但是显然有人在这样做。根据我的经验,您的内存不足是因为您尝试将所有响应都转换为字符串,但是响应太大而无法处理。我建议您流式传输JSON数据。您可以从HTTP帖子获得的inputstream响应中流传输JSON数据,但是您需要通过从原始响应输入流中创建另一个输入流来跳过XML部分,并跳过XML部分
在我使用Google GSON的流API之前,我还遇到了OOM错误,因为我得到的JSON数据非常大(许多图像和声音以Base64编码),但是使用GSON流,我可以克服该错误,因为它不读取每个令牌的数据一次全部。另外,您也可以使用Jackson JSON库,我认为它也具有流API,以及如何将其与Google GSON的实现方式几乎一样使用。希望我的回答能对您有所帮助,如果您对我的回答还有其他疑问,请随时在评论中提问:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句