用 ANSI C 編寫的高效能 JSON 函式庫。
快速:在現代 CPU 上每秒可以讀取或寫入 GB 等級的 JSON 資料。
便攜:符合 ANSI C (C89) 的跨平台相容性。
嚴格:符合 RFC 8259 JSON 標準,確保嚴格的數位格式和 UTF-8 驗證。
可擴充:提供允許註解、尾隨逗號、NaN/Inf 和自訂記憶體分配器的選項。
準確度:可以準確讀寫int64
、 uint64
、 double
數。
靈活:支援無限的 JSON 巢狀等級、 u0000
個字元和非空終止字串。
Manipulation :支援使用 JSON Pointer、JSON Patch 和 JSON Merge Patch 進行查詢和修改。
開發人員友好:只需 1 個h
和 1 個c
檔案即可輕鬆整合。
陣列或物件儲存為資料結構(例如鍊錶),這使得透過索引或鍵存取元素比使用迭代器慢。
物件中允許有重複的鍵,並且保留鍵的順序。
JSON解析結果是不可變的,需要一個mutable copy
來修改。
基準項目和資料集:yyjson_benchmark
如果大多數 JSON 欄位在編譯時已知,則 simdjson 的新On Demand
API 速度會更快。此基準測試項目僅檢查 DOM API,稍後將新增新的基準測試。
推特.json | 解析(GB/秒) | 字串化 (GB/s) |
---|---|---|
yyjson(原位) | 1.80 | 1.51 |
yyjson | 1.72 | 1.42 |
simdjson | 1.52 | 0.61 |
薩森 | 1.16 | |
Rapidjson(原位) | 0.77 | |
Rapidjson(utf8) | 0.26 | 0.39 |
.cjson | 0.32 | 0.17 |
詹森 | 0.05 | 0.11 |
推特.json | 解析(GB/秒) | 字串化 (GB/s) |
---|---|---|
yyjson(原位) | 3.51 | 2.41 |
yyjson | 2.39 | 2.01 |
simdjson | 2.19 | 0.80 |
薩森 | 1.74 | |
Rapidjson(原位) | 0.75 | |
Rapidjson(utf8) | 0.30 | 0.58 |
.cjson | 0.48 | 0.33 |
詹森 | 0.09 | 0.24 |
更多帶有互動式圖表的基準報告(更新2020-12-12)
平台 | 中央處理器 | 編譯器 | 作業系統 | 報告 |
---|---|---|---|---|
英特爾 NUC 8i5 | 酷睿i5-8259U | 2019年MSVC | Windows 10 2004 | 圖表 |
英特爾 NUC 8i5 | 酷睿i5-8259U | 鏗鏘10.0 | 烏班圖20.04 | 圖表 |
英特爾 NUC 8i5 | 酷睿i5-8259U | 海灣合作委員會9.3 | 烏班圖20.04 | 圖表 |
AWS EC2 c5a.large | AMD 霄龍 7R32 | 海灣合作委員會9.3 | 烏班圖20.04 | 圖表 |
AWS EC2 t4g.中 | Graviton2 (ARM64) | 海灣合作委員會9.3 | 烏班圖20.04 | 圖表 |
蘋果 iPhone 12 Pro | A14(ARM64) | 鏗鏘12.0 | iOS 14 | 圖表 |
現代處理器具有:
高指令級並行性
優秀的分支預測器
未對齊記憶體存取的懲罰較低
具有良好優化器的現代編譯器(例如 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","name: %sn", yyjson_get_str (name));printf("名稱長度:%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"],迭代數組yyjson_val *hits = yyjson_obj_get(root, "hits");size_t idx, maxyyjson_getyyjson_vvyjson_arr; (點擊數, idx, 最大, 命中) {printf("命中%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[Sname""/cad"""pad""adb 如果///Sstr; , root, "name", "Mash");yyjson_mut_obj_add_int(doc, root, "star", 4);// 使用陣列設定root["hits"] int attempts_arr[] = {2, 2, 1, 3} ; yyjson_mut_val *hits = yyjson_mut_arr_with_sint32(doc, hits_arr, 4);yyjson_mut_obj_add_val(doc, root, "hits", hits);// 轉為字串,min.Acons, 0,000,000m = %_jt, Ncons 你, Nform; json) { printf("json: %sn", json); // {"name":"Mash","star":4,"hits":[2,2,1,3]}free((void *)json); }// 釋放 docyyjson_mut_doc_free(doc);
// 讀取 JSON 文件,允許註解和尾隨逗號 flg = YYJSON_READ_ALLOW_COMMENTS | YYJSON_READ_ALLOW_TRAILING_COMMAS;yyjson_read_err err;yyjson_doc *doc = yyjson_read_file("/tmp/config.json", flg, NULL, &err);// 迭代根物件if (docy) {yyjson_objter_docy; _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", )); } } 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_obj_iter iter;yyjson_mut_obj_iter_init(obj, &iter);yyjson_mut_val *key, *val;while ((key = yyjson_mutson_mut_val *key, *val;while ((key = yyjson_mut_objiter_nval; );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): errcode", err. ,錯誤訊息); }// 釋放 docyyjson_doc_free(idoc);yyjson_mut_doc_free(doc);
最新的(未發布的)文件可以在 doc 目錄中存取。可以在此處查看發布版本的預生成 Doxygen HTML:
首頁
建置和測試
API 和範例程式碼
資料結構
變更日誌
將 yyjson 公開給其他語言或在內部使用 yyjson 來實現主要功能的項目的非詳盡清單。如果您有一個使用 yyjson 的項目,請隨時開啟 PR 將其新增至此清單。
專案 | 語言 | 描述 |
---|---|---|
py_yyjson | Python | yyjson 的 Python 綁定 |
或json | Python | 用於 Python 的 JSON 庫,帶有可選的 yyjson 後端 |
cpp-yyjson | C++ | 帶有 yyjson 後端的 C++ JSON 庫 |
反射cpp | C++ | 透過從結構中自動檢索欄位名稱進行序列化的 C++ 庫 |
yyjsonr | 右 | 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 Pointer查詢和修改JSON。
為 JSON 讀取器和寫入器新增RAW
類型。
新增限制實數輸出精度的選項。
新增支援 JSON5 的選項(如果可行)。
新增函數來比較兩個 JSON 文件。
新增有關效能優化的文件。
確保ABI穩定性。
該項目是在 MIT 許可下發布的。