ไลบรารี JSON ประสิทธิภาพสูงที่เขียนด้วย ANSI C
เร็ว : สามารถอ่านหรือเขียนข้อมูล JSON กิกะไบต์ต่อวินาทีบน CPU สมัยใหม่ได้
แบบพกพา : สอดคล้องกับ ANSI C (C89) สำหรับความเข้ากันได้ข้ามแพลตฟอร์ม
เข้มงวด : สอดคล้องกับมาตรฐาน RFC 8259 JSON ทำให้มั่นใจได้ถึงรูปแบบตัวเลขที่เข้มงวดและการตรวจสอบ UTF-8
ขยายได้ : เสนอตัวเลือกเพื่ออนุญาตความคิดเห็น เครื่องหมายจุลภาคต่อท้าย NaN/Inf และการจัดสรรหน่วยความจำแบบกำหนดเอง
ความแม่นยำ : สามารถอ่านและเขียน int64
, uint64
และตัวเลข double
ได้อย่างแม่นยำ
ยืดหยุ่น : รองรับระดับการซ้อน JSON แบบไม่จำกัด, อักขระไม่เกิน u0000
ตัว และสตริงที่ไม่สิ้นสุดด้วยค่า null
การจัดการ : รองรับการสืบค้นและแก้ไขโดยใช้ JSON Pointer, JSON Patch และ JSON Merge Patch
เป็นมิตรกับนักพัฒนา : รวมเข้ากับไฟล์ h
และ c
เพียงไฟล์เดียว
อาร์เรย์หรือออบเจ็กต์ถูกจัดเก็บเป็นโครงสร้างข้อมูล เช่น รายการลิงก์ ซึ่งทำให้การเข้าถึงองค์ประกอบด้วยดัชนีหรือคีย์ช้ากว่าการใช้ตัววนซ้ำ
อนุญาตให้มีคีย์ซ้ำในออบเจ็กต์ และลำดับของคีย์จะยังคงอยู่
ผลการแยกวิเคราะห์ JSON นั้นไม่เปลี่ยนรูป โดยต้อง mutable copy
สำหรับการแก้ไข
โครงการมาตรฐานและชุดข้อมูล: yyjson_benchmark
On Demand
API ใหม่ของ simdjson จะเร็วขึ้นหากรู้จักฟิลด์ JSON ส่วนใหญ่ในขณะคอมไพล์ โปรเจ็กต์การวัดประสิทธิภาพนี้จะตรวจสอบเฉพาะ DOM API เท่านั้น โดยจะมีการเพิ่มการวัดประสิทธิภาพใหม่ในภายหลัง
twitter.json | แยกวิเคราะห์ (GB/s) | กำหนดสตริง (GB/s) |
---|---|---|
ยิจสัน(insitu) | 1.80 | 1.51 |
ใช่ๆ | 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/s) | กำหนดสตริง (GB/s) |
---|---|---|
ยิจสัน(insitu) | 3.51 | 2.41 |
ใช่ๆ | 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 |
รายงานเกณฑ์มาตรฐานเพิ่มเติมพร้อมแผนภูมิเชิงโต้ตอบ (อัปเดต 12-12-2020)
แพลตฟอร์ม | ซีพียู | คอมไพเลอร์ | ระบบปฏิบัติการ | รายงาน |
---|---|---|---|---|
อินเทล NUC 8i5 | คอร์ i5-8259U | เอ็มเอสวีซี 2019 | วินโดวส์ 10 2004 | แผนภูมิ |
อินเทล NUC 8i5 | คอร์ i5-8259U | เสียงดังกราว 10.0 | อูบุนตู 20.04 | แผนภูมิ |
อินเทล NUC 8i5 | คอร์ i5-8259U | จีซีซี 9.3 | อูบุนตู 20.04 | แผนภูมิ |
AWS EC2 c5a.large | เอเอ็มดี EPYC 7R32 | จีซีซี 9.3 | อูบุนตู 20.04 | แผนภูมิ |
AWS EC2 t4g.ปานกลาง | กราวิตัน2 (ARM64) | จีซีซี 9.3 | อูบุนตู 20.04 | แผนภูมิ |
แอปเปิ้ล ไอโฟน 12 โปร | A14 (ARM64) | เสียงดังกราว 12.0 | ไอโอเอส 14 | แผนภูมิ |
โปรเซสเซอร์ที่ทันสมัยพร้อม:
ความเท่าเทียมระดับคำสั่งสูง
ตัวทำนายสาขาที่ยอดเยี่ยม
โทษต่ำสำหรับการเข้าถึงหน่วยความจำที่ไม่ตรงแนว
คอมไพเลอร์สมัยใหม่พร้อมเครื่องมือเพิ่มประสิทธิภาพที่ดี (เช่นเสียงดังกราว)
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);// รับรูท["ชื่อ"]yyjson_val *ชื่อ = yyjson_obj_get(root, "ชื่อ");printf("ชื่อ: %sn", yyjson_get_str(ชื่อ));printf("ความยาวของชื่อ:%dn", (int)yyjson_get_len(ชื่อ));// รับรูต["ดาว "]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, สูงสุด, hit) {printf("hit%d: %dn", (int)idx, (int)yyjson_get_int(ตี)); }// ปล่อย 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 ); // {"ชื่อ":Mash","star":4,"hits":[2,2,1,3]}ฟรี((void *)json); }// ฟรี docyyjson_mut_doc_free(doc);
// อ่านไฟล์ JSON อนุญาตให้แสดงความคิดเห็นและต่อท้าย commasyyjson_read_flag 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);// วนซ้ำบน root 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(คีย์), 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) ;// ลบค่าว่างออก ค่าในรูท 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("write error (%u): %sn", err.code, ผิดพลาด.msg); }// ฟรี docyyjson_doc_free(idoc);yyjson_mut_doc_free(doc);
สามารถเข้าถึงเอกสารล่าสุด (ยังไม่เผยแพร่) ได้ในไดเร็กทอรี doc Doxygen HTML ที่สร้างไว้ล่วงหน้าสำหรับเวอร์ชันวางจำหน่ายสามารถดูได้ที่นี่:
หน้าแรก
สร้างและทดสอบ
API และโค้ดตัวอย่าง
โครงสร้างข้อมูล
บันทึกการเปลี่ยนแปลง
รายการโดยสังเขปของโปรเจ็กต์ที่เปิดเผย yyjson เป็นภาษาอื่น หรือใช้ yyjson ภายในสำหรับคุณลักษณะหลัก หากคุณมีโปรเจ็กต์ที่ใช้ yyjson โปรดเปิด PR เพื่อเพิ่มลงในรายการนี้
โครงการ | ภาษา | คำอธิบาย |
---|---|---|
py_yyjson | หลาม | Python เชื่อมโยงสำหรับ yyjson |
ออร์จสัน | หลาม | ไลบรารี JSON สำหรับ Python พร้อมแบ็กเอนด์ yyjson ที่เป็นตัวเลือก |
cpp-yyjson | ซี++ | ไลบรารี C ++ JSON พร้อมแบ็กเอนด์ yyjson |
สะท้อน-cpp | ซี++ | ไลบรารี C++ สำหรับการทำให้เป็นอนุกรมผ่านการดึงชื่อฟิลด์อัตโนมัติจากโครงสร้าง |
เย้ๆ | ร | R มีผลผูกพันสำหรับ yyjson |
อนันดา | สวิฟท์ | การถอดรหัสโมเดล JSON ตาม yyjson |
เป็ด | ซี++ | DuckDB เป็นระบบจัดการฐานข้อมูล SQL OLAP ที่อยู่ในกระบวนการ |
ดึงข้อมูลอย่างรวดเร็ว | ค | เครื่องมือที่คล้าย neofetch สำหรับดึงข้อมูลระบบและแสดงข้อมูลในลักษณะที่สวยงาม |
ซริธึม | ค | เวิร์กสเตชันเสียงดิจิทัลที่ใช้ yyjson เพื่อทำให้ไฟล์โปรเจ็กต์ JSON เป็นอนุกรม |
เป็นมนุษย์มากขึ้น | ค | เครื่องมือแนะนำที่เน้นความเป็นเอกลักษณ์ของผู้ที่ได้รับใบรับรอง |
mruby-yyjson | รูบี้ | การแยกวิเคราะห์ JSON และไลบรารีการทำให้เป็นอนุกรมที่มีประสิทธิภาพสำหรับ mruby โดยใช้ yyjson |
YYJSON.jl | จูเลีย | จูเลียเข้าผูกพันกับ yyjson |
เพิ่มหน้าเอกสารประกอบ
เพิ่มเวิร์กโฟลว์ GitHub สำหรับ CI และ codecov
เพิ่มการทดสอบเพิ่มเติม: valgrind, sanitizer, fuzzing
รองรับ JSON Pointer เพื่อสืบค้นและแก้ไข JSON
เพิ่มประเภท RAW
สำหรับโปรแกรมอ่านและเขียน JSON
เพิ่มตัวเลือกเพื่อจำกัดความแม่นยำเอาต์พุตจำนวนจริง
เพิ่มตัวเลือกเพื่อรองรับ JSON5 (หากเป็นไปได้)
เพิ่มฟังก์ชันเพื่อแยกเอกสาร JSON สองฉบับ
เพิ่มเอกสารเกี่ยวกับการเพิ่มประสิทธิภาพการทำงาน
มั่นใจในความมั่นคงของ ABI
โครงการนี้เผยแพร่ภายใต้ใบอนุญาต MIT