JSONを解析する唯一の方法はDOMですか?
一部のJSONパーサーは、増分(「ストリーミング」)パーサーを提供します。 Javaの場合、少なくともjson.orgページからの次のパーサーはそのようなインターフェースを提供します。
( 別の回答 で参照されるSoftware Monkeyのパーサーに加えて)
実際、非常に多くのJSONパーサーがこの単純な低レベルインターフェイスを提供しないのは、ちょっと奇妙です。結局、彼らはすでに低レベルの解析を実装する必要があるので、なぜ公開しないのでしょう。
編集(2011年6月):Gsonにも独自の ストリーミングAPI (gson 1.6を使用)
DOMとは、パーサーがドキュメント全体を一度に読み取ってから作業することを意味すると仮定します。最近ではDOMはXMLを暗示する傾向があるが、実際にはIMOは正確な推論ではないことに注意してください。
それで、あなたの質問に答えて-「はい」、ストリーミングAPIがあり、「いいえ」、DOMが唯一の方法ではありません。ただし、JSONドキュメントをストリームとして処理することは、多くのオブジェクトが単純なフィールド/値のペアではなく、処理するために解析する必要がある値として他のオブジェクトを含むため、多くの場合問題があり、これは再帰的なものになりがちです。ただし、単純なメッセージの場合は、ストリーム/イベントベースのパーサーを使用して便利なことができます。
JSON用のプルイベントパーサーを作成しました(1クラス、約700行)。しかし、私が見た他のほとんどはドキュメント指向です。パーサーの上に構築したレイヤーの1つはドキュメントリーダーで、約30 LOCかかりました。パーサーを実際にドキュメントローダーとして使用したのはこれまでです(上記の理由により)。
ネットを検索すると、プルおよびプッシュベースのJSONパーサーが見つかるはずです。
編集:私は パーサーに投稿 をダウンロードのために私のサイトに持っています。動作するコンパイル可能なクラスと完全な例が含まれています。
EDIT2: JSON website もご覧ください。
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バインディング
それらのいくつかはストリーミングを許可しないかもしれませんが、それらの多くは確かに許可します。
免責事項:私は自分のプロジェクトを提案しています。
私は、SAXとDOMの機能のいくつかを組み合わせたJavascriptでストリーミングJSONパーサーを保守しています。
アイデアは、ストリーミング解析を許可することですが、プログラマーが生のSAXのように多くの異なるイベントを聞く必要はありません。私はSAXが好きですが、ほとんどの人が必要とするものに対してはかなり低いレベルになる傾向があります。 JSONPathパターンを登録することにより、JSONストリームから興味深いノードをリッスンできます。
コードはGithubにあります:
Node.jsとブラウザの両方で実行される純粋なjavascriptとライブラリを使用する場合は、クラリネットを試すことができます。
https://github.com/dscape/clarinet
パーサーはイベントベースであり、ストリーミングであるため、巨大なファイルを扱うことができます。 APIはsaxに非常に近く、コードはsax-jsから分岐されます。
JSONのストリームを解析および処理するためのNodeJS NPMライブラリを次に示します。 https://npmjs.org/package/JSONStream
LitJSONは、ストリーミングスタイルのAPIをサポートしています。 manual からの引用:
「一部の開発者に馴染みのあるJSONデータを処理するための代替インターフェースは、ストリームのような方法でデータを読み書きできるようにするクラスを使用することです。これらのクラスはJsonReader
およびJsonWriter
です。 。
「実際、これらの2つのタイプはこのライブラリの基盤であり、JsonMapper
タイプはそれらの上に構築されます。そのため、開発者はある意味、リーダークラスとライタークラスを低レベルプログラミングと考えることができますLitJSONのインターフェース。」
Pythonの場合、ijsonの代替(明らかに軽量で効率的)は jsaone です(大まかなベンチマークのリンクを参照してください。jsaoneは約3倍高速です)。
[〜#〜]免責事項[〜#〜]:私はjsaoneの著者であり、作成したテストは非常に基本的なものです...間違っていることが証明されてうれしい!
質問のタイトルに答える: [〜#〜] yajl [〜#〜] CのJSONパーサーライブラリ:
YAJLは、解析の再開をサポートするために必要なすべての状態を記憶しています。これにより、データがディスクまたはネットワークから読み取られるときに、構文解析を段階的に実行できます。
だから、yajlを使用してJSONを解析することは、データの処理ストリームと見なすことができると思います。