2015-03-09 1 views
1

D'abord l'information d'arrière-plan: J'utilise commons httpclient pour faire une demande d'obtention au serveur. Réponse du serveur une chaîne json. J'analyse la chaîne en utilisant org.json.analyse syntaxique json réponse

Le problème: En fait, tout fonctionne, c'est-à-dire pour les petites réponses (plus petit que 2^31 octets = valeur maximale d'un nombre entier qui limite le getResponseBody et le stringbuilder). J'ai d'autre part une réponse géante (plus de plusieurs Go) et je suis coincé. J'ai essayé d'utiliser le "getResponseBodyAsStream" de httpclient mais la réponse est si grande que mon système se bloque. J'ai essayé d'utiliser un String, un Stringbuilder, même en l'enregistrant dans un fichier.

La question: D'abord, est-ce la bonne approche, si oui, quelle est la meilleure façon de gérer une telle réponse? Si non, comment dois-je procéder?

+0

Que faites-vous avec les données? est-ce que vous l'agrégez en mémoire, ou l'écrivez-vous à une destination? aussi, que signifie "coincé"? ne répond pas, lance une exception, etc ...? – jtahlborn

+2

Je suppose qu'une meilleure question est, pourquoi essayez-vous de renvoyer des Go de données dans une resposne web? – OldProgrammer

+0

Pour mon analyseur JSON personnel, j'utilise un lecteur pour analyser les données. Cela pourrait être un InputStreamReader mais je ne suis pas sûr que cela entraînera des fuites de ressources. De plus, la lib n'est pas complète et doit encore fonctionner (mais la partie JSON fonctionne) – engineercoding

Répondre

2

Si jamais vous devez avoir une réponse qui peut être un facteur de GB, vous devez analyser le json comme un caractère de flux (presque) et éviter de créer des objets String ... (c'est très important car la collection garbage votre système se libère pendant quelques secondes si vous créez constamment beaucoup d'ordures)

Vous pouvez utiliser SAXophone pour créer une logique d'analyse.

Vous aurez à mettre en œuvre toutes les méthodes comme onObjectStart, onObjectClose, onObjectKey etc ... il est difficile au début, mais une fois que vous prenez une implémentation de regard PrettyPrinter dans des emballages de test que vous aurez l'idée ...

Une fois correctement mis en œuvre, vous pouvez gérer un flux infini de données;)

PS Ceci est conçu pour HFT donc c'est tout au sujet de la performance et pas de déchets ...

+0

sympa, je vais vérifier. Merci pour la réponse rapide! – jorne

+0

J'ai implémenté un analyseur qui convertit n'importe quel JSON en Java Map ou Array ... mais votre cas est différent en fonction de ce que vous faites :) :) vous serez certainement capable de consommer un morceau de json et de vous assurer après Consommation Aucune poubelle n'est laissée (références propres etc ...) – vach

+0

Si vous avez du mal à analyser ces gestionnaires, je peux partager ce code, donc vous aurez l'idée de ce à quoi ça ressemble ... c'est comme lire json par morceau, vous gardez l'état où vous êtes maintenant, ce que vous lisez ou ce que vous attendez dans la prochaine méthode de rappel etc ... – vach