Sj.h: 約150行のC99で書かれた極小JSONパースライブラリ
(github.com/rxi)- Sj.h は約 150行 で構成された 超軽量JSONパーサー で、C99 ベースの環境で利用可能
- ゼロメモリ割り当て、最小限の状態保持 などの特徴を持ち、軽量な組み込み環境や依存関係の最小化に向いている
- 数値および文字列のパース については直接処理する方式を採用しており、関連処理をユーザーが自由に実装できる
- 行:列ベースのエラーメッセージ をサポートし、デバッグ 時の可読性と位置特定性が高い
- パブリックドメインのソフトウェアとして、誰でも 自由に使用・変更・配布などが可能
プロジェクト紹介
- Sj.h は、過剰な機能や不要なメモリ割り当てなしに、最小限のコード だけでJSONパース機能を提供するC99ヘッダーファイル
- 実装全体は約 150行 で、組み込みシステム、ツール、または外部ライブラリ依存を減らしたい場合に適している
主な特徴
- ゼロメモリ割り当て(zero-allocations) および 最小状態(minimal state) で動作し、メモリ負荷が非常に小さい
- 行:列情報 を含む エラーメッセージ により、パース中に発生した問題の位置を把握しやすい
- 数値パースは標準では提供されず、strtod, atoi などユーザーが望む方法を使える
- 文字列パースも直接実装でき、Unicode surrogate pair 処理なども必要に応じて構築可能
- すべてのソースコードはパブリックドメイン(Unlicense)として提供され、ライセンスなどの制約なく使用・変更可能
使用例
- JSON文字列をRect構造体にパースする簡単な例が用意されている
char *json_text = "{ \"x\": 10, \"y\": 20, \"w\": 30, \"h\": 40 }"; typedef struct { int x, y, w, h; } Rect; ... - sj_Reader, sj_Value, sj_reader, sj_read, sj_iter_object など、簡潔で明快なAPIを使用
- 数値値のパース や キー・値比較 は自分で実装する必要がある(builtin は提供されない)
- demo フォルダでさまざまな追加の使用例を確認できる
ライセンス
- Sj.h は誰でも制約なく使える パブリックドメインソフトウェア
- 詳細は LICENSE ファイルを参照
その他
- コードとフォルダ構成がシンプルで、別途設定やビルド手順なしにすぐ使える
- 独立しており、外部依存がなく、主に 軽量性 と 使いやすさ が求められる環境に適している
1件のコメント
Hacker News のコメント
intをすべて 64 ビットに置き換えます。それでも入力が 2^64 を超えれば結局は落ちます。intオーバーフローをコード内で一つひとつチェックするつもりはありませんintは 32 ビットなので、各行について 20 億階層のネスト値、20 億行を超えるファイル、あるいは 20 億文字を超える 1 行が必要な場合にしか問題になりません]や}のどちらでオブジェクトや配列を閉じても受け入れますし、\vも whitespace として認識するので標準より寛容です。「正しい JSON のためのデータ抽出器」くらいに考えるのが適切でしょう。ただし string や number のパーサを自前で書くのが面倒なことはあります。特に、生成側と JSON 文法のサブセットについて合意が必要な場合はなおさらです= { 0 }が抜けているのか気になります。該当コードを見ると、r->depthが初期化されないままsj__discard_untilループの中で depth と偶然一致する可能性がありそうですr->depthはここですでに 0 に初期化されています。該当コード を参照してくださいstdbool.hとstddef.hを含むだけです)。C++ テンプレートの小細工もなく、API も直感的です。こうした要件をすべて満たす C ライブラリは本当に珍しく、C++ ではさらに珍しいです