2013-08-20 2 views
0

Je lis d'une API fournie par une entreprise, mais le problème est que l'un des comptes à partir de laquelle je reçois les données a environ 22000 objets JSON, il se lit bien avec de petites quantités de données, je dirais jusqu'à 8000 enregistrements, mais alors je reçois des problèmes comme le json n'est pas bien formaté en plus du problème de pouvoir lire la réponse.Lire beaucoup de données retournées par l'API

La réponse vient ainsi:

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

J'ai demandé une aide plus tôt ici pour voir la meilleure façon de le faire, et je reçu une réponse sur la lecture à l'aide de l'analyseur XML et un analyseur de JSON , j'utilise GSON.

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

puis

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

Le problème est l'approche que j'ai est qu'il renvoie des erreurs lors de la lecture du XML, il commence à lire, mais après un certain temps qu'il arrête avec des erreurs comme:

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) 
...... 

J'apprécierais des conseils sur la façon de procéder avec cela, je suis un peu nouveau sur android.

+4

Trouver qui a enveloppé un tableau JSON de 22k éléments en XML (et en bonus dans * un élément *) et tirez dessus. Vous allez avoir beaucoup de mal à y faire face. –

+0

L'API de requête à distance doit être fournie. – pierrotlefou

+0

Je sais ... quelle douleur ... – jedgard

Répondre

0

Je ne sais pas qui emballerait des objets 22k dans une chaîne XML, mais apparemment quelqu'un fait cela. De mon expérience, votre manque de mémoire est parce que vous essayez de convertir toute la réponse en chaîne, mais la réponse est trop grande pour être traitée. Je vous recommande de diffuser les données JSON. Vous pouvez diffuser les données JSON à partir de la réponse inputtream que vous recevez de votre message HTTP, mais vous devez ignorer la partie XML en créant un autre flux d'entrée à partir du flux d'entrée de réponse d'origine et ignorer la partie XML

Avant de commencer j'utilise l'API streaming de google GSON J'ai aussi une erreur OOM car les données JSON que j'ai eues sont très volumineuses (beaucoup d'images et de sons en encodage Base64) mais avec le streaming GSON je peux surmonter cette erreur car elle lit les données par token une fois que. Et pour l'alternative, vous pouvez également utiliser la bibliothèque Jackson JSON Je pense qu'il a aussi l'API de streaming et comment l'utiliser presque même avec ma mise en œuvre avec google GSON. J'espère que ma réponse peut vous aider et si vous avez une autre question sur ma réponse n'hésitez pas à demander dans le commentaire :)

+0

Cela ressemble à un plan, comment puis-je sauter ce xml si cela ne vous dérange pas de demander. – jedgard

Questions connexes