2013-08-20 2 views
0

Я читаю из API, предоставляемого компанией, но проблема в том, что одна из учетных записей, из которых я получаю данные, имеет около 22000 объектов json, она отлично читается с небольшими количествами данных, я бы сказал до 8000 записей, но потом я получаю такие проблемы, как json, не очень хорошо отформатирован, кроме проблемы с возможностью чтения ответа.Чтение много данных, возвращаемых API

Ответ приходит так:

<?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

Найдите, кто-нибудь обернул массив JSON из 22k элементов в XML (и в качестве бонуса в * одном элементе *). , и стрелять в них. Тебе очень сложно справиться с этим. –

+0

должен быть предоставлен API запросов диапазона. – pierrotlefou

+0

Я знаю ... какая боль ... – jedgard

ответ

0

Я не знаю, кто бы обернул 22k объектов внутри строки xml, но, видимо, кто-то это делает. По моему опыту, ваша нехватка памяти связана с тем, что вы пытаетесь преобразовать весь ответ в строку, но ответ слишком велик для обработки. Я рекомендую вам передавать данные JSON. Вы можете передавать данные JSON из входящего запроса ответа, который вы получаете из своего HTTP-сообщения, но вам нужно пропустить часть XML, создав другой поток ввода из исходного потока ответа и пропустив XML-часть.

До I использовать потоковый API из google GSON. Я также получил ошибку OOM, потому что данные JSON, которые я получил, - это очень большие данные (много изображений и звуков в кодировке Base64), но с потоковой передачей GSON я могу преодолеть эту ошибку, потому что она считывает данные на токен не у всех на один раз. А для альтернативы вы также можете использовать библиотеку Jackson JSON. Я думаю, что у нее также есть потоковый API и как использовать его почти так же, как и с моей реализацией с google GSON. Надеюсь, мой ответ может вам помочь, и если у вас есть еще один вопрос о моем ответе, не стесняйтесь спрашивать в комментарии :)

+0

Это звучит как план, как я могу пропустить этот xml, если вы не возражаете про меня. – jedgard

Смежные вопросы