Pustaka JSON berkinerja tinggi yang ditulis dalam ANSI C.
Cepat : dapat membaca atau menulis data JSON gigabyte per detik pada CPU modern.
Portabel : sesuai dengan ANSI C (C89) untuk kompatibilitas lintas platform.
Ketat : mematuhi standar RFC 8259 JSON, memastikan format angka yang ketat dan validasi UTF-8.
Dapat Diperpanjang : menawarkan opsi untuk mengizinkan komentar, koma tambahan, NaN/Inf, dan pengalokasi memori khusus.
Akurasi : dapat membaca dan menulis angka int64
, uint64
, dan double
secara akurat.
Fleksibel : mendukung tingkat sarang JSON tanpa batas, u0000
karakter, dan string yang tidak diakhiri dengan nol.
Manipulasi : mendukung query dan modifikasi menggunakan JSON Pointer, JSON Patch, dan JSON Merge Patch.
Ramah Pengembang : integrasi mudah hanya dengan satu h
dan satu file c
.
Array atau objek disimpan sebagai struktur data seperti daftar tertaut, yang membuat pengaksesan elemen berdasarkan indeks atau kunci lebih lambat dibandingkan menggunakan iterator.
Kunci duplikat diperbolehkan dalam suatu objek, dan urutan kunci dipertahankan.
Hasil penguraian JSON tidak dapat diubah, memerlukan mutable copy
untuk modifikasi.
Proyek tolok ukur dan kumpulan data: yyjson_benchmark
API On Demand
simdjson yang baru lebih cepat jika sebagian besar bidang JSON diketahui pada waktu kompilasi. Proyek benchmark ini hanya memeriksa DOM API, benchmark baru akan ditambahkan nanti.
twitter.json | menguraikan (GB/dtk) | merangkai (GB/s) |
---|---|---|
yyjson(insitu) | 1.80 | 1.51 |
yyjson | 1.72 | 1.42 |
simdjson | 1.52 | 0,61 |
sajson | 1.16 | |
rapidjson(initu) | 0,77 | |
cepatjson(utf8) | 0,26 | 0,39 |
cjson | 0,32 | 0,17 |
Jansson | 0,05 | 0,11 |
twitter.json | menguraikan (GB/dtk) | merangkai (GB/s) |
---|---|---|
yyjson(insitu) | 3.51 | 2.41 |
yyjson | 2.39 | 2.01 |
simdjson | 2.19 | 0,80 |
sajson | 1.74 | |
rapidjson(initu) | 0,75 | |
cepatjson(utf8) | 0,30 | 0,58 |
cjson | 0,48 | 0,33 |
Jansson | 0,09 | 0,24 |
Lebih banyak laporan benchmark dengan grafik interaktif (pembaruan 12-12-2020)
Platform | CPU | Penyusun | sistem operasi | Laporan |
---|---|---|---|---|
Intel NUC 8i5 | Inti i5-8259U | msvc 2019 | jendela 10 2004 | Grafik |
Intel NUC 8i5 | Inti i5-8259U | dentang 10.0 | Ubuntu 20.04 | Grafik |
Intel NUC 8i5 | Inti i5-8259U | gcc 9.3 | Ubuntu 20.04 | Grafik |
AWS EC2 c5a.besar | AMD EPYC 7R32 | gcc 9.3 | Ubuntu 20.04 | Grafik |
AWS EC2 t4g.medium | Graviton2 (ARM64) | gcc 9.3 | Ubuntu 20.04 | Grafik |
Apple iPhone 12 Pro | A14 (ARM64) | dentang 12.0 | iOS 14 | Grafik |
Prosesor modern dengan:
paralelisme tingkat instruksi tinggi
prediktor cabang yang sangat baik
penalti rendah untuk akses memori yang tidak selaras
Kompiler modern dengan pengoptimal yang baik (misalnya dentang)
const char *json = "{"name":"Mash","star":4,"hits":[2,2,1,3]}";// Baca JSON dan dapatkan rootyyjson_doc *doc = yyjson_read(json , strlen(json), 0);yyjson_val *root = yyjson_doc_get_root(doc);// Dapatkan root["nama"]yyjson_val *nama = yyjson_obj_get(root, "nama");printf("nama: %sn", yyjson_get_str(nama));printf("panjang nama:%dn", (int)yyjson_get_len(nama));// Dapatkan root["bintang "]yyjson_val *bintang = yyjson_obj_get(root, "bintang");printf("bintang: %dn", (int)yyjson_get_int(star));// Dapatkan root["hits"], ulangi arrayyyjson_val *hits = yyjson_obj_get(root, "hits");size_t idx, max;yyjson_val *hit;yyjson_arr_foreach(hits, idx, maks, tekan) {printf("tekan%d: %dn", (int)idx, (int)yyjson_get_int(pukulan)); }// Bebaskan docyyjson_doc_free(doc);// Semua fungsi menerima masukan NULL, dan mengembalikan NULL jika terjadi kesalahan.
// Buat docyyjson_mut_doc *doc = yyjson_mut_doc_new(NULL);yyjson_mut_val *root = yyjson_mut_obj(doc);yyjson_mut_doc_set_root(doc, root);// Setel root["nama"] dan root["star"]yyjson_mut_obj_add_str(doc, akar, "nama", "Mash");yyjson_mut_obj_add_int(doc, root, "star", 4);// Setel root["hits"] dengan arrayint hits_arr[] = {2, 2, 1, 3};yyjson_mut_val *hits = yyjson_mut_arr_with_sint32( dokumen, hits_arr, 4);yyjson_mut_obj_add_val(doc, root, "hits", hits);// Untuk merangkai, minifiedconst char *json = yyjson_mut_write(doc, 0, NULL);if (json) {printf("json: %sn", json ); // {"name":"Mash","star":4,"hits":[2,2,1,3]}free((void *)json); }// Bebaskan docyyjson_mut_doc_free(doc);
// Baca file JSON, izinkan komentar dan akhiri komasyyjson_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);// Ulangi objek akar (doc) {yyjson_val *obj = yyjson_doc_get_root(doc);yyjson_obj_iter iter;yyjson_obj_iter_init(obj, &iter);yyjson_val *kunci, *val;sementara ((kunci = yyjson_obj_iter_next(&iter))) {val = yyjson_obj_iter_get_val(kunci);printf("%s: %sn", yyjson_get_str(kunci), yyjson_get_type_desc(val)); } } else {printf("kesalahan baca (%u): %s pada posisi: %ldn", err.code, err.msg, err.pos); }// Bebaskan docyyjson_doc_free(doc);
// Membaca file JSON sebagai 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) ;// Hapus nilai null di root objectyyjson_mut_obj_iter iter;yyjson_mut_obj_iter_init(obj, &iter);yyjson_mut_val *kunci, *val;sementara ((kunci = yyjson_mut_obj_iter_next(&iter))) {val = yyjson_mut_obj_iter_get_val(kunci);if (yyjson_mut_is_null(val)) {yyjson_mut_obj_iter_remove(&iter); } }// Tulis json cantik, escape 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("kesalahan tulis (%u): %sn", err.code, err.msg); }// Bebaskan docyyjson_doc_free(idoc);yyjson_mut_doc_free(doc);
Dokumentasi terbaru (yang belum dirilis) dapat diakses di direktori doc. HTML Doxygen yang telah dibuat sebelumnya untuk versi rilis dapat dilihat di sini:
Halaman Beranda
Bangun dan uji
API dan kode sampel
Struktur data
log perubahan
Daftar tidak lengkap proyek yang memaparkan yyjson ke bahasa lain atau menggunakan yyjson secara internal untuk fitur utama. Jika Anda memiliki proyek yang menggunakan yyjson, silakan buka PR untuk menambahkannya ke daftar ini.
Proyek | Bahasa | Keterangan |
---|---|---|
py_yyjson | ular piton | Ikatan python untuk yyjson |
orjson | ular piton | Pustaka JSON untuk Python dengan backend yyjson opsional |
cpp-yyjson | C++ | Pustaka C++ JSON dengan backend yyjson |
mencerminkan-cpp | C++ | Pustaka C++ untuk serialisasi melalui pengambilan nama bidang otomatis dari struct |
yyjsonr | R | R mengikat untuk yyjson |
Ananda | Cepat | Decoding model JSON berdasarkan yyjson |
bebekdb | C++ | DuckDB adalah Sistem Manajemen Basis Data SQL OLAP yang sedang dalam proses |
pengambilan cepat | C | Alat mirip neofetch untuk mengambil informasi sistem dan menampilkannya dengan cara yang cantik |
Zrythm | C | Stasiun Kerja Audio Digital yang menggunakan yyjson untuk membuat serial file proyek JSON |
menjadi lebih manusiawi | C | Mesin rekomendasi dengan fokus pada keunikan orang yang menerima rec |
mruby-yyjson | mruby | Pustaka parsing dan serialisasi JSON yang efisien untuk mruby menggunakan yyjson |
YYJSON.jl | Julia | Ikatan Julia untuk yyjson |
Tambahkan halaman dokumentasi.
Tambahkan alur kerja GitHub untuk CI dan codecov.
Tambahkan lebih banyak tes: valgrind, sanitizer, fuzzing.
Mendukung JSON Pointer untuk menanyakan dan memodifikasi JSON.
Tambahkan tipe RAW
untuk pembaca dan penulis JSON.
Tambahkan opsi untuk membatasi presisi keluaran bilangan real.
Tambahkan opsi untuk mendukung JSON5 (jika memungkinkan).
Tambahkan fungsi untuk membedakan dua dokumen JSON.
Tambahkan dokumentasi tentang pengoptimalan kinerja.
Pastikan stabilitas ABI.
Proyek ini dirilis di bawah lisensi MIT.