web-dev-qa-db-fra.com

Existe-t-il une API de streaming pour JSON?

DOM est-il le seul moyen d'analyser JSON?

65
kal

Certains analyseurs JSON proposent un analyseur incrémentiel ("streaming"); pour Java, au moins les analyseurs suivants de la page json.org offrent une telle interface:

(en plus de l'analyseur de Software Monkey mentionné par ne autre réponse )

En fait, il est assez étrange que tant d'analyseurs JSON n'offrent PAS cette interface simple de bas niveau - après tout, ils ont déjà besoin d'implémenter une analyse de bas niveau, alors pourquoi ne pas l'exposer.

EDIT (juin 2011): Gson a aussi son propre API de streaming (avec gson 1.6)

59
StaxMan

Par DOM, je suppose que vous voulez dire que l'analyseur lit un document entier à la fois avant de pouvoir travailler avec. Notez que dire DOM tend à impliquer XML, de nos jours, mais IMO qui n'est pas vraiment une inférence précise.

Donc, en réponse à vos questions - "Oui", il y a des API de streaming et "Non", DOM n'est pas le seul moyen. Cela dit, le traitement d'un document JSON en tant que flux est souvent problématique dans la mesure où de nombreux objets ne sont pas de simples paires champ/valeur, mais contiennent d'autres objets en tant que valeurs, que vous devez analyser pour traiter, et cela a tendance à finir par être récursif. Mais pour les messages simples, vous pouvez faire des choses utiles avec un analyseur basé sur un flux/événement.

J'ai écrit un analyseur d'événements pull pour JSON (c'était une classe, environ 700 lignes). Mais la plupart des autres que j'ai vus sont orientés document. L'une des couches que j'ai construites au-dessus de mon analyseur est un lecteur de documents, qui a pris environ 30 LOC. Je n'ai utilisé mon analyseur que dans la pratique comme chargeur de documents (pour la raison ci-dessus).

Je suis sûr que si vous recherchez sur le net, vous trouverez des analyseurs basés sur Pull et Push pour JSON.

EDIT: J'ai posté l'analyseur sur mon site pour téléchargement. Une classe compilable et un exemple complet sont inclus.

EDIT2: Vous voudrez également regarder le site Web JSON .

22
Lawrence Dol

Comme stefanB l'a mentionné, http://lloyd.github.com/yajl/ est une bibliothèque C pour l'analyse de flux JSON. Il existe également de nombreux wrappers mentionnés sur cette page pour d'autres langues:

  • yajl-Ruby - Ruby fixations pour YAJL
  • yajl-objc - Liaisons Objective-C pour YAJL
  • YAJL IO liaisons (pour la langue IO)
  • Les liaisons Python sont disponibles en deux versions, py-yajl OR yajl-py
  • yajl-js - liaisons node.js (en miroir à github).
  • lua-yajl - fixations lua
  • ooc-yajl - fixations ooc
  • yajl-tcl - fixations tcl

certains d'entre eux peuvent ne pas autoriser le streaming, mais beaucoup d'entre eux le font certainement.

14
pykler

Avertissement: je propose mon propre projet.

Je maintiens un analyseur JSON en streaming en Javascript qui combine certaines des fonctionnalités de SAX et DOM:

site Web Oboe.js

L'idée est de permettre l'analyse en streaming, mais pas d'exiger du programmeur qu'il écoute de nombreux événements différents comme avec SAX brut. J'aime SAX mais il a tendance à être assez bas pour ce dont la plupart des gens ont besoin. Vous pouvez écouter n'importe quel nœud intéressant du flux JSON en enregistrant des modèles JSONPath.

Le code est sur Github ici:

page Github Oboe.js

8
jimhigson

Si vous souhaitez utiliser du javascript pur et une bibliothèque qui s'exécute à la fois dans node.js et dans le navigateur, vous pouvez essayer la clarinette:

https://github.com/dscape/clarinet

L'analyseur est basé sur des événements, et puisqu'il est en streaming, il permet de traiter des fichiers énormes. L'API est très proche de sax et le code est issu de sax-js.

7
dscape

Voici une bibliothèque NodeJS NPM pour analyser et gérer les flux de JSON: https://npmjs.org/package/JSONStream

3
Tom Chapin

Si vous recherchez spécifiquement Python, alors ijson prétend le prendre en charge. Cependant, ce n'est qu'un analyseur, donc je n'ai rien trouvé pour Python qui peut générer json en tant que flux.

Pour C++, il y a rapidjson qui prétend prendre en charge à la fois l'analyse et la génération en continu.

3
haridsv

LitJSON prend en charge une API de type streaming. Citant du manuel :

"Une interface alternative à la gestion des données JSON qui peut être familière à certains développeurs consiste à utiliser des classes qui permettent de lire et d'écrire des données de manière similaire à un flux. Ces classes sont JsonReader et JsonWriter .

"Ces deux types sont en fait le fondement de cette bibliothèque, et le type JsonMapper est construit au-dessus d'eux, donc en quelque sorte, le développeur peut considérer les classes reader et writer comme la programmation de bas niveau interface pour LitJSON. "

3
Agnel Kurian

Pour Python, une alternative (apparemment plus légère et plus efficace) à ijson est jsaone (voir ce lien pour des repères approximatifs, montrant que jsaone est environ 3 fois plus rapide).

[~ # ~] clause de non-responsabilité [~ # ~] : je suis l'auteur de jsaone, et les tests que j'ai faits sont très basiques ... serai heureux d'avoir tort!

2
Pietro Battiston

Répondre au titre de la question: YAJL une bibliothèque d'analyseur JSON en C:

YAJL se souvient de tous les états requis pour prendre en charge le redémarrage de l'analyse. Cela permet une analyse incrémentielle à mesure que les données sont lues sur un disque ou un réseau.

Je suppose donc que l'utilisation de yajl pour analyser JSON peut être considérée comme un flux de données de traitement.

1
stefanB