ANSI C で書かれた高性能 JSON ライブラリ。
高速: 最新の CPU で 1 秒あたりギガバイトの JSON データを読み書きできます。
ポータブル: クロスプラットフォーム互換性のために ANSI C (C89) に準拠しています。
Strict : RFC 8259 JSON 標準に準拠し、厳密な数値形式と UTF-8 検証を保証します。
拡張可能: コメント、末尾のカンマ、NaN/Inf、カスタム メモリ アロケータを許可するオプションを提供します。
精度: int64
、 uint64
、およびdouble
数値を正確に読み書きできます。
柔軟性: 無制限の JSON ネスト レベル、 u0000
文字、および null で終了しない文字列をサポートします。
操作: JSON ポインター、JSON パッチ、および JSON マージ パッチを使用したクエリと変更をサポートします。
開発者に優しい: 1 つのh
ファイルと 1 つのc
ファイルだけで簡単に統合できます。
配列またはオブジェクトはリンク リストなどのデータ構造として格納されるため、インデックスまたはキーによる要素へのアクセスはイテレータを使用するよりも遅くなります。
オブジェクト内では重複キーが許可され、キーの順序は保持されます。
JSON 解析結果は不変であり、変更するにはmutable copy
必要です。
ベンチマーク プロジェクトとデータセット: yyjson_benchmark
ほとんどの JSON フィールドがコンパイル時に認識されている場合、simdjson の新しいOn Demand
API は高速になります。このベンチマーク プロジェクトは DOM API のみをチェックします。新しいベンチマークは後で追加されます。
twitter.json | 解析 (GB/秒) | 文字列化 (GB/秒) |
---|---|---|
yyjson(現場) | 1.80 | 1.51 |
yyjson | 1.72 | 1.42 |
シムジソン | 1.52 | 0.61 |
サジソン | 1.16 | |
Rapidjson(現場) | 0.77 | |
Rapidjson(utf8) | 0.26 | 0.39 |
チソン | 0.32 | 0.17 |
ヤンソン | 0.05 | 0.11 |
twitter.json | 解析 (GB/秒) | 文字列化 (GB/秒) |
---|---|---|
yyjson(現場) | 3.51 | 2.41 |
yyjson | 2.39 | 2.01 |
シムジソン | 2.19 | 0.80 |
サジソン | 1.74 | |
Rapidjson(現場) | 0.75 | |
Rapidjson(utf8) | 0.30 | 0.58 |
チソン | 0.48 | 0.33 |
ヤンソン | 0.09 | 0.24 |
インタラクティブなグラフを含むベンチマーク レポートの追加 (2020 年 12 月 12 日更新)
プラットフォーム | CPU | コンパイラ | OS | 報告 |
---|---|---|---|---|
インテル NUC 8i5 | コアi5-8259U | msvc 2019 | Windows 10 2004 | チャート |
インテル NUC 8i5 | コアi5-8259U | カラン 10.0 | Ubuntu 20.04 | チャート |
インテル NUC 8i5 | コアi5-8259U | gcc9.3 | Ubuntu 20.04 | チャート |
AWS EC2 c5a.large | AMD EPYC 7R32 | gcc9.3 | Ubuntu 20.04 | チャート |
AWS EC2 t4g.medium | グラビトン2 (ARM64) | gcc9.3 | Ubuntu 20.04 | チャート |
アップル iPhone 12 プロ | A14(ARM64) | カラン 12.0 | iOS14 | チャート |
以下を備えた最新のプロセッサ:
高い命令レベルの並列処理
優れた分岐予測器
不整合なメモリアクセスに対するペナルティが低い
優れたオプティマイザーを備えた最新のコンパイラー (clang など)
const char *json = "{"name":"Mash","star":4,"hits":[2,2,1,3]}";// JSON を読み取り、rootyyjson_doc を取得 *doc = yyjson_read(json , strlen(json), 0);yyjson_val *root = yyjson_doc_get_root(doc);// 取得root["name"]yyjson_val *name = yyjson_obj_get(root, "name");printf("name: %sn", yyjson_get_str(name));printf("name length:%dn", (int)yyjson_get_len(name) ));// root["star"]yyjson_val を取得 *star = yyjson_obj_get(root, "star");printf("star: %dn", (int)yyjson_get_int(star));// root["hits"] を取得し、arrayyyjson_val を反復処理する *hits = yyjson_obj_get(root, "hits");size_t idx, max;yyjson_val *hit;yyjson_arr_foreach(hits, idx, max, hit) {printf("hit%d: %dn", (int)idx, (int)yyjson_get_int(hit)); }// docyyjson_doc_free(doc) を解放します;// すべての関数は NULL 入力を受け入れ、エラー時に NULL を返します。
// 変更可能な docyyjson_mut_doc を作成します *doc = yyjson_mut_doc_new(NULL);yyjson_mut_val *root = yyjson_mut_obj(doc);yyjson_mut_doc_set_root(doc, root);// root["name"] と root["star"] を設定します yyjson_mut_obj_add_str(doc,ルート、「名前」、 "Mash");yyjson_mut_obj_add_int(doc, root, "star", 4);// root["hits"] を arrayint で設定します hits_arr[] = {2, 2, 1, 3};yyjson_mut_val *hits = yyjson_mut_arr_with_sint32(ドキュメント、hits_arr、 4);yyjson_mut_obj_add_val(doc, root, "hits", hits);// 文字列に、minifiedconst char *json = yyjson_mut_write(doc, 0, NULL);if (json) {printf("json: %sn", json ); // {"name":"マッシュ","star":4,"hits":[2,2,1,3]}free((void *)json); }// docyyjson_mut_doc_free(doc); を解放します。
// コメントと末尾の commasyyjson_read_flag flg = YYJSON_READ_ALLOW_COMMENTS | JSON ファイルを読み取ります。 YYJSON_READ_ALLOW_TRAILING_COMMAS;yyjson_read_err err;yyjson_doc *doc = yyjson_read_file("/tmp/config.json", flg, NULL, &err);// ルート objectif (doc) {yyjson_val *obj = yyjson_doc_get_root(doc);yyjson_obj_iter iter;yyjson_obj_iter_init(obj, &iter);yyjson_val *key, *val;while ((key = yyjson_obj_iter_next(&iter))) {val = yyjson_obj_iter_get_val(key);printf("%s: %sn", yyjson_get_str(key), yyjson_get_type_desc(val)); } } else {printf("読み取りエラー (%u): %s、位置: %ldn", err.code, err.msg, err.pos); }// docyyjson_doc_free(doc); を解放します。
// JSON ファイルを可変として読み取ります docyyjson_doc *idoc = yyjson_read_file("/tmp/config.json", 0, NULL, NULL);yyjson_mut_doc *doc = yyjson_doc_mut_copy(idoc, NULL);yyjson_mut_val *obj = yyjson_mut_doc_get_root(doc) ;// null 値を削除しますルート objectyyjson_mut_obj_iter iter;yyjson_mut_obj_iter_init(obj, &iter);yyjson_mut_val *key, *val;while ((key = yyjson_mut_obj_iter_next(&iter))) {val = yyjson_mut_obj_iter_get_val(key);if (yyjson_mut_is_null(val)) {yyjson_mut_obj_iter_remove(&iter); } }// json をきれいに書き込み、エスケープ unicodeyyjson_write_flag flg = YYJSON_WRITE_PRETTY | YYJSON_WRITE_ESCAPE_UNICODE;yyjson_write_err err;yyjson_mut_write_file("/tmp/config.json", doc, flg, NULL, &err);if (err.code) {printf("書き込みエラー (%u): %sn", err.code, err.msg); }// docyyjson_doc_free(idoc);yyjson_mut_doc_free(doc); を解放します。
最新の (未リリースの) ドキュメントには、doc ディレクトリからアクセスできます。リリース バージョン用に事前に生成された Doxygen HTML は、ここで表示できます。
ホームページ
ビルドとテスト
APIとサンプルコード
データ構造
変更履歴
yyjson を他の言語に公開するプロジェクト、または主要な機能のために内部で yyjson を使用するプロジェクトの非網羅的なリスト。 yyjson を使用するプロジェクトがある場合は、自由に PR を開いてこのリストに追加してください。
プロジェクト | 言語 | 説明 |
---|---|---|
py_yyjson | パイソン | yyjson の Python バインディング |
オルジソン | パイソン | オプションの yyjson バックエンドを備えた Python 用の JSON ライブラリ |
cpp-yyjson | C++ | yyjson バックエンドを備えた C++ JSON ライブラリ |
リフレクトcpp | C++ | 構造体からの自動フィールド名取得によるシリアル化のための C++ ライブラリ |
yyjsonr | R | yyjson の R バインディング |
アナンダ | 迅速 | yyjson に基づいた JSON モデルのデコード |
アヒルデータベース | C++ | DuckDB はインプロセス SQL OLAP データベース管理システムです |
高速フェッチ | C | システム情報を取得し、それらをきれいに表示するための neofetch のようなツール |
ズリズム | C | yyjson を使用して JSON プロジェクト ファイルをシリアル化するデジタル オーディオ ワークステーション |
もっと人間になれ | C | レクを受ける人の独自性を重視したレコメンドエンジン |
mruby-yyjson | ムルビー | yyjson を使用した mruby 用の効率的な JSON 解析およびシリアル化ライブラリ |
YYJSON.jl | ジュリア | yyjson の Julia バインディング |
ドキュメントページを追加します。
CI と codecov 用の GitHub ワークフローを追加します。
さらにテストを追加します: valgrind、sanitizer、fuzzing。
JSON をクエリおよび変更するための JSON ポインターをサポートします。
JSON リーダーおよびライターにRAW
タイプを追加します。
実数の出力精度を制限するオプションを追加します。
JSON5 をサポートするオプションを追加します (可能な場合)。
2 つの JSON ドキュメントを比較する関数を追加します。
パフォーマンスの最適化に関するドキュメントを追加します。
ABI の安定性を確保します。
このプロジェクトは MIT ライセンスに基づいてリリースされています。