it-swarm.com.de

Gibt es eine Streaming-API für JSON?

Ist DOM die einzige Möglichkeit, JSON zu analysieren?

65
kal

Einige JSON-Parser bieten inkrementelle ("Streaming") Parser an. Für Java bieten mindestens die folgenden Parser von json.org eine solche Schnittstelle:

(zusätzlich zum Parser von Software Monkey, auf den sich eine andere Antwort bezieht)

Eigentlich ist es seltsam, dass so viele JSON-Parser diese einfache Low-Level-Schnittstelle NICHT anbieten - schließlich müssen sie bereits Low-Level-Parsing implementieren, also warum nicht es verfügbar machen.

BEARBEITEN (Juni 2011): Auch Gson hat ein eigenes Streaming-API (mit gson 1.6)

59
StaxMan

Mit DOM meine ich, dass der Parser ein gesamtes Dokument auf einmal liest, bevor Sie damit arbeiten können. Beachten Sie, dass DOM heutzutage in der Regel XML impliziert, IMO jedoch keine wirklich genaue Schlussfolgerung ist.

Also, als Antwort auf Ihre Fragen - "Ja", es gibt Streaming-APIs und "Nein", DOM ist nicht der einzige Weg. Das heißt, die Verarbeitung eines JSON-Dokuments als Stream ist oft problematisch, da viele Objekte keine einfachen Feld/Wert-Paare sind, sondern andere Objekte als Werte enthalten, die Sie analysieren müssen, um sie zu verarbeiten. Aber für einfache Nachrichten können Sie nützliche Dinge mit einem Stream/Event-basierten Parser tun.

Ich habe einen Pull-Event-Parser für JSON geschrieben (es war eine Klasse, ungefähr 700 Zeilen). Aber die meisten anderen, die ich gesehen habe, sind dokumentenorientiert. Eine der Schichten, die ich auf meinem Parser aufgebaut habe, ist ein Dokumentenleser, der ungefähr 30 LOC benötigte. Ich habe meinen Parser in der Praxis immer nur als Dokumentlader verwendet (aus dem oben genannten Grund).

Ich bin sicher, wenn Sie im Internet suchen, werden Sie Pull- und Push-basierte Parser für JSON finden.

EDIT: Ich habe den Parser gepostet auf meiner Seite zum Download angeboten. Eine funktionierende kompilierbare Klasse und ein vollständiges Beispiel sind enthalten.

EDIT2: Sie möchten auch die JSON-Website .

22
Lawrence Dol

Wie von stefanB erwähnt, ist http://lloyd.github.com/yajl/ eine C-Bibliothek zum Parsen von JSON-Streams. Auf dieser Seite werden auch viele Wrapper für andere Sprachen erwähnt:

  • yajl-Ruby - Ruby Bindungen für YAJL
  • yajl-objc - Objective-C-Bindungen für YAJL
  • YAJL IO Bindings (für die IO Sprache)
  • Python-Bindungen gibt es in zwei Varianten: py-yajl OR yajl-py
  • yajl-js - node.js Bindungen (gespiegelt nach github).
  • lua-yajl - Lua-Bindungen
  • ooc-yajl - ooc Bindungen
  • yajl-tcl - tcl Bindungen

einige von ihnen erlauben möglicherweise kein Streaming, aber viele von ihnen sicherlich.

14
pykler

Haftungsausschluss: Ich schlage mein eigenes Projekt vor.

Ich verwalte einen Streaming-JSON-Parser in Javascript, der einige der Funktionen von SAX und DOM kombiniert:

Oboe.js website

Die Idee ist, Streaming-Parsing zuzulassen, ohne dass der Programmierer viele verschiedene Ereignisse abhören muss, wie dies bei RAW-SAX der Fall ist. Ich mag SAX, aber es ist für die meisten Leute in der Regel recht leise. Sie können auf jeden interessanten Knoten im JSON-Stream warten, indem Sie JSONPath-Muster registrieren.

Der Code ist auf Github hier:

Oboe.js Github Seite

8
jimhigson

Wenn Sie reines Javascript und eine Bibliothek verwenden möchten, die sowohl in node.js als auch im Browser ausgeführt wird, können Sie clarinet ausprobieren:

https://github.com/dscape/clarinet

Der Parser ist ereignisbasiert und ermöglicht seit dem Streaming den Umgang mit großen Dateien. Die API ist sehr nah an Sax und der Code ist von Sax-Js gespalten.

7
dscape

Hier ist eine NodeJS-NPM-Bibliothek zum Parsen und Verarbeiten von JSON-Streams: https://npmjs.org/package/JSONStream

3
Tom Chapin

Wenn Sie speziell nach Python suchen, gibt ijson an, es zu unterstützen. Da es sich jedoch nur um einen Parser handelt, habe ich für Python nichts gefunden, was Json als Stream generieren könnte.

Für C++ gibt es rapidjson , das behauptet, sowohl das Parsen als auch das Generieren auf Streaming-Weise zu unterstützen.

3
haridsv

LitJSON unterstützt eine Streaming-API. Zitat aus dem Handbuch :

"Eine alternative Schnittstelle zum Umgang mit JSON-Daten, die einigen Entwicklern bekannt sein könnten, sind Klassen, die es ermöglichen, Daten wie in einem Stream zu lesen und zu schreiben. Diese Klassen sind JsonReader und JsonWriter. .

"Diese beiden Typen sind in der Tat die Grundlage dieser Bibliothek, und der Typ JsonMapper baut auf ihnen auf, so dass der Entwickler die Lese - und Schreibklassen in gewisser Weise als Low - Level - Programmierung betrachten kann Schnittstelle für LitJSON. "

3
Agnel Kurian

Für Python ist eine Alternative (anscheinend leichter und effizienter) zu ijson jsaone (siehe diesen Link für grobe Benchmarks, was zeigt, dass jsaone ungefähr 3x schneller ist).

[~ # ~] Haftungsausschluss [~ # ~] : Ich bin der Autor von jsaone, und die Tests, die ich gemacht habe, sind sehr einfach ... ich bin froh, wenn man sich als falsch erweist!

2

Beantwortung des Fragentitels: YAJL eine JSON-Parser-Bibliothek in C:

YAJL merkt sich den gesamten Status, der für den Neustart des Parsings erforderlich ist. Auf diese Weise kann das Parsen schrittweise erfolgen, wenn Daten von einer Festplatte oder einem Netzwerk gelesen werden.

Ich denke also, dass die Verwendung von yajl zum Parsen von JSON als Verarbeitungsstrom von Daten betrachtet werden kann.

1
stefanB