web-dev-qa-db-ja.com

JSON用のストリーミングAPIはありますか?

JSONを解析する唯一の方法はDOMですか?

65
kal

一部のJSONパーサーは、増分(「ストリーミング」)パーサーを提供します。 Javaの場合、少なくともjson.orgページからの次のパーサーはそのようなインターフェースを提供します。

別の回答 で参照されるSoftware Monkeyのパーサーに加えて)

実際、非常に多くのJSONパーサーがこの単純な低レベルインターフェイスを提供しないのは、ちょっと奇妙です。結局、彼らはすでに低レベルの解析を実装する必要があるので、なぜ公開しないのでしょう。

編集(2011年6月):Gsonにも独自の ストリーミングAPI (gson 1.6を使用)

59
StaxMan

DOMとは、パーサーがドキュメント全体を一度に読み取ってから作業することを意味すると仮定します。最近ではDOMはXMLを暗示する傾向があるが、実際にはIMOは正確な推論ではないことに注意してください。

それで、あなたの質問に答えて-「はい」、ストリーミングAPIがあり、「いいえ」、DOMが唯一の方法ではありません。ただし、JSONドキュメントをストリームとして処理することは、多くのオブジェクトが単純なフィールド/値のペアではなく、処理するために解析する必要がある値として他のオブジェクトを含むため、多くの場合問題があり、これは再帰的なものになりがちです。ただし、単純なメッセージの場合は、ストリーム/イベントベースのパーサーを使用して便利なことができます。

JSON用のプルイベントパーサーを作成しました(1クラス、約700行)。しかし、私が見た他のほとんどはドキュメント指向です。パーサーの上に構築したレイヤーの1つはドキュメントリーダーで、約30 LOCかかりました。パーサーを実際にドキュメントローダーとして使用したのはこれまでです(上記の理由により)。

ネットを検索すると、プルおよびプッシュベースのJSONパーサーが見つかるはずです。

編集:私は パーサーに投稿 をダウンロードのために私のサイトに持っています。動作するコンパイル可能なクラスと完全な例が含まれています。

EDIT2: JSON website もご覧ください。

22
Lawrence Dol

StefanBが述べたように、 http://lloyd.github.com/yajl/ はJSONを解析するストリーム用のCライブラリです。そのページには、他の言語用の多くのラッパーも記載されています。

  • yajl-Ruby-Ruby YAJLのバインディング
  • yajl-objc-YAJLのObjective-Cバインディング
  • YAJL IOバインディング(IO言語の場合)
  • Pythonバインディングには、py-yajl OR yajl-py
  • yajl-js-node.jsバインディング(githubにミラーリング)。
  • lua-yajl-luaバインディング
  • ooc-yajl-oocバインディング
  • yajl-tcl-tclバインディング

それらのいくつかはストリーミングを許可しないかもしれませんが、それらの多くは確かに許可します。

14
pykler

免責事項:私は自分のプロジェクトを提案しています。

私は、SAXとDOMの機能のいくつかを組み合わせたJavascriptでストリーミングJSONパーサーを保守しています。

Oboe.jsウェブサイト

アイデアは、ストリーミング解析を許可することですが、プログラマーが生のSAXのように多くの異なるイベントを聞く必要はありません。私はSAXが好きですが、ほとんどの人が必要とするものに対してはかなり低いレベルになる傾向があります。 JSONPathパターンを登録することにより、JSONストリームから興味深いノードをリッスンできます。

コードはGithubにあります:

Oboe.js Githubページ

8
jimhigson

Node.jsとブラウザの両方で実行される純粋なjavascriptとライブラリを使用する場合は、クラリネットを試すことができます。

https://github.com/dscape/clarinet

パーサーはイベントベースであり、ストリーミングであるため、巨大なファイルを扱うことができます。 APIはsaxに非常に近く、コードはsax-jsから分岐されます。

7
dscape

JSONのストリームを解析および処理するためのNodeJS NPMライブラリを次に示します。 https://npmjs.org/package/JSONStream

3
Tom Chapin

特にPythonを探しているなら、 ijson はそれをサポートすることを主張します。ただし、これはパーサーに過ぎないため、jsonをストリームとして生成できるPythonについては何も見つかりませんでした。

C++の場合、解析と生成の両方をストリーミング方式でサポートすると主張する rapidjson があります。

3
haridsv

LitJSONは、ストリーミングスタイルのAPIをサポートしています。 manual からの引用:

「一部の開発者に馴染みのあるJSONデータを処理するための代替インターフェースは、ストリームのような方法でデータを読み書きできるようにするクラスを使用することです。これらのクラスはJsonReaderおよびJsonWriterです。 。

「実際、これらの2つのタイプはこのライブラリの基盤であり、JsonMapperタイプはそれらの上に構築されます。そのため、開発者はある意味、リーダークラスとライタークラスを低レベルプログラミングと考えることができますLitJSONのインターフェース。」

3
Agnel Kurian

Pythonの場合、ijsonの代替(明らかに軽量で効率的)は jsaone です(大まかなベンチマークのリンクを参照してください。jsaoneは約3倍高速です)。

[〜#〜]免責事項[〜#〜]:私はjsaoneの著者であり、作成したテストは非常に基本的なものです...間違っていることが証明されてうれしい!

2

質問のタイトルに答える: [〜#〜] yajl [〜#〜] CのJSONパーサーライブラリ:

YAJLは、解析の再開をサポートするために必要なすべての状態を記憶しています。これにより、データがディスクまたはネットワークから読み取られるときに、構文解析を段階的に実行できます。

だから、yajlを使用してJSONを解析することは、データの処理ストリームと見なすことができると思います。

1
stefanB