JSON形式のデータを操作する必要が最近あるため、C / C ++のJSONを操作するために既存のライブラリの問題を調査することにしました。 。 現時点では、多かれ少なかれ大きな数字があります。 json.org(
http://www.json.org )のリストは次のとおりです。
- C:
- JSON_checker
- JSONパーサー
- json-c
- MのJSONパーサー
- ヤジル
- cJSON
- ヤンソン
- js0n
- リブ
- C ++:
- jsoncpp
- zoolib
- ジョスト
- カジュン
- libJSON
- nosjob
目的のライブラリに対して提案した主な要件:
- 低メモリ消費(XMLパーサーなどのほとんどのJSONパーサーは、ファイルをメモリ内のいくつかの構造に解析し、そこからファイル内のデータに関する情報を抽出できます(XMLのDOMツリー)。これらのオブジェクトのメモリサイズの依存関係はファイル自体に対して線形であり、サイズが予想サイズを超えるファイルを受信すると、予期しないメモリの増加(および割り当て/割り当て解除の時間)が発生し、そのような量のメモリが存在しない可能性がありますに)。
- データの部分的な解析の可能性(つまり、必要なデータを既に読み取っている場合、他のすべてを解析する必要があるのはなぜですか?たとえば、メッセージヘッダーを読み取るだけで十分です。)
- 不要な「添えもの」がありません(特殊なクエリや検証を使用した検索など-解析のみに制限されています)。
最初はcJSON(
http://sourceforge.net/projects/cjson )を調べましたが、ドキュメント全体をメモリに解析することがわかりました(ただし、これは最小限の消費で十分な速度で行われます)。 最終的に、私はyajl(
http://lloyd.github.com/yajl )に落ち着きました-唯一のJSONストリーミングパーサーと言わなければなりません。
- SAXスタイルで解析を実行します-開発者は特定のタイプのイベント(オブジェクトの開始、キー会議、テキスト値の会議、数値の会議など)のハンドラメソッドを作成し、リストをパーサーに転送してから、プロセスでパーサーとパーサーを起動します解析では、ファイル内で検出されたデータを使用してこれらのメソッドを呼び出します(通知を受信するイベントと受信しないイベントを選択できます)。
- ストリーミング解析が可能になります-データは部分的に解析に転送できます(ネットワーク経由で受信したり、他のコードで生成したり、ディスクから読み込んだりするため)。
- 解析中に解析を中断できます。
- メモリ消費は最小限です(実験的にテストされています:必要な最小値のみが使用され、解析のためのデータのサイズに依存しません)。
- レベルでの速度(実行されるチェックの最小量による-整形式検証のみ)。
- JSONを生成する機能(イベント通知の受信とほぼ同じ方法で実行されます)。
- パーサーのドキュメントはかなり少ないですが、サイト上のいくつかの例とヘッダーファイル内のコメントの調査により、このライブラリの操作方法に関するすべてを理解できます。
そして結論にいくつかの言葉:
- ライブラリは私のニーズに合わせて作成され、関数ポインターを使用しているにもかかわらず、C ++クラスで使用することさえ学びました。
- しかし、「パーサー」パーサークローラーについて知りたいのですが、JSONには「プル」パーサー(StAXまたはlibxml-2の「リーダー」インターフェース)がありますか?