Eine leistungsstarke JSON-Bibliothek, geschrieben in ANSI C.
Schnell : Kann JSON-Daten im Gigabyte-Bereich pro Sekunde auf modernen CPUs lesen oder schreiben.
Tragbar : Entspricht ANSI C (C89) für plattformübergreifende Kompatibilität.
Streng : Entspricht dem JSON-Standard RFC 8259 und gewährleistet ein striktes Zahlenformat und UTF-8-Validierung.
Erweiterbar : Bietet Optionen zum Zulassen von Kommentaren, nachgestellten Kommas, NaN/Inf und einer benutzerdefinierten Speicherzuweisung.
Genauigkeit : Kann int64
, uint64
und double
-Zahlen genau lesen und schreiben.
Flexibel : Unterstützt unbegrenzte JSON-Verschachtelungsebenen, u0000
Zeichen und nicht nullterminierte Zeichenfolgen.
Manipulation : Unterstützt das Abfragen und Ändern mithilfe von JSON Pointer, JSON Patch und JSON Merge Patch.
Entwicklerfreundlich : einfache Integration mit nur einer h
und einer c
Datei.
Ein Array oder Objekt wird als Datenstruktur, beispielsweise als verknüpfte Liste, gespeichert, was den Zugriff auf Elemente über Index oder Schlüssel langsamer macht als die Verwendung eines Iterators.
Doppelte Schlüssel sind in einem Objekt zulässig und die Reihenfolge der Schlüssel bleibt erhalten.
Das JSON-Parsing-Ergebnis ist unveränderlich und erfordert zur Änderung eine mutable copy
.
Benchmark-Projekt und Datensatz: yyjson_benchmark
Die neue On Demand
-API von simdjson ist schneller, wenn die meisten JSON-Felder zur Kompilierungszeit bekannt sind. Dieses Benchmark-Projekt überprüft nur die DOM-API, ein neuer Benchmark wird später hinzugefügt.
twitter.json | Parsen (GB/s) | stringify (GB/s) |
---|---|---|
yyjson(insitu) | 1,80 | 1,51 |
yyjson | 1,72 | 1,42 |
simdjson | 1,52 | 0,61 |
sajson | 1.16 | |
rapidjson(insitu) | 0,77 | |
rapidjson(utf8) | 0,26 | 0,39 |
cjson | 0,32 | 0,17 |
Jansson | 0,05 | 0,11 |
twitter.json | Parsen (GB/s) | stringify (GB/s) |
---|---|---|
yyjson(insitu) | 3.51 | 2.41 |
yyjson | 2.39 | 2.01 |
simdjson | 2.19 | 0,80 |
sajson | 1,74 | |
rapidjson(insitu) | 0,75 | |
rapidjson(utf8) | 0,30 | 0,58 |
cjson | 0,48 | 0,33 |
Jansson | 0,09 | 0,24 |
Weitere Benchmark-Berichte mit interaktiven Diagrammen (Update 12.12.2020)
Plattform | CPU | Compiler | Betriebssystem | Bericht |
---|---|---|---|---|
Intel NUC 8i5 | Core i5-8259U | msvc 2019 | Windows 10 2004 | Diagramme |
Intel NUC 8i5 | Core i5-8259U | Klirren 10.0 | Ubuntu 20.04 | Diagramme |
Intel NUC 8i5 | Core i5-8259U | gcc 9.3 | Ubuntu 20.04 | Diagramme |
AWS EC2 c5a.large | AMD EPYC 7R32 | gcc 9.3 | Ubuntu 20.04 | Diagramme |
AWS EC2 t4g.medium | Graviton2 (ARM64) | gcc 9.3 | Ubuntu 20.04 | Diagramme |
Apple iPhone 12 Pro | A14 (ARM64) | Klirren 12.0 | iOS 14 | Diagramme |
Ein moderner Prozessor mit:
Hohe Parallelität auf Befehlsniveau
ausgezeichneter Zweigprädiktor
geringe Strafe für falsch ausgerichteten Speicherzugriff
Ein moderner Compiler mit gutem Optimierer (z. B. Clang)
const char *json = "{"name":"Mash","star":4,"hits":[2,2,1,3]}";// JSON lesen und rootyyjson_doc erhalten *doc = yyjson_read(json , strlen(json), 0);yyjson_val *root = yyjson_doc_get_root(doc);// Get 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));// Get root["star "]yyjson_val *star = yyjson_obj_get(root, "star");printf("star: %dn", (int)yyjson_get_int(star));// Root["hits"] abrufen, über das Array iterierenyyjson_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)); }// Geben Sie docyyjson_doc_free(doc);// frei.// Alle Funktionen akzeptieren NULL-Eingaben und geben bei Fehler NULL zurück.
// Erstelle ein veränderliches docyyjson_mut_doc *doc = yyjson_mut_doc_new(NULL);yyjson_mut_val *root = yyjson_mut_obj(doc);yyjson_mut_doc_set_root(doc, root);// Setze root["name"] und root["star"]yyjson_mut_obj_add_str(doc, Wurzel, „Name“, "Mash");yyjson_mut_obj_add_int(doc, root, "star", 4);// Setze root["hits"] mit einem Arrayint hits_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);// Zu string, 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); }// Geben Sie das docyyjson_mut_doc_free(doc) frei;
// JSON-Datei lesen, Kommentare und nachgestellte Kommas zulassenyyjson_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);// Iterieren Sie über das Stammobjektif (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("Lesefehler (%u): %s an Position: %ldn", err.code, err.msg, err.pos); }// Geben Sie das docyyjson_doc_free(doc) frei;
// JSON-Datei als veränderbare Datei lesen 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) ;// Nullwerte im Stammverzeichnis entfernen 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); } }// Schreibe den JSON hübsch, entkomme 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, err.msg); }// Geben Sie das docyyjson_doc_free(idoc);yyjson_mut_doc_free(doc); frei.
Auf die neueste (unveröffentlichte) Dokumentation kann im doc-Verzeichnis zugegriffen werden. Das vorgenerierte Doxygen-HTML für die Release-Version kann hier eingesehen werden:
Startseite
Bauen und testen
API und Beispielcode
Datenstruktur
Änderungsprotokoll
Eine nicht erschöpfende Liste von Projekten, die yyjson anderen Sprachen zugänglich machen oder yyjson intern für eine Hauptfunktion verwenden. Wenn Sie ein Projekt haben, das yyjson verwendet, können Sie gerne eine PR öffnen, um es dieser Liste hinzuzufügen.
Projekt | Sprache | Beschreibung |
---|---|---|
py_yyjson | Python | Python-Bindungen für yyjson |
orjson | Python | JSON-Bibliothek für Python mit einem optionalen yyjson-Backend |
cpp-yyjson | C++ | C++-JSON-Bibliothek mit einem yyjson-Backend |
reflektieren-cpp | C++ | C++-Bibliothek zur Serialisierung durch automatisierten Feldnamenabruf aus Strukturen |
yyjsonr | R | R-Bindung für yyjson |
Ananda | Schnell | JSON-Modelldekodierung basierend auf yyjson |
duckdb | C++ | DuckDB ist ein In-Process-SQL-OLAP-Datenbankverwaltungssystem |
Fastfetch | C | Ein Neofetch-ähnliches Tool zum Abrufen von Systeminformationen und deren ansprechender Darstellung |
Rhythmus | C | Digitale Audio-Workstation, die yyjson zum Serialisieren von JSON-Projektdateien verwendet |
bemorehuman | C | Empfehlungsmaschine mit Fokus auf die Einzigartigkeit der Person, die die Empfehlung erhält |
mruby-yyjson | mruby | Effiziente JSON-Parsing- und Serialisierungsbibliothek für mruby mit yyjson |
YYJSON.jl | Julia | Julia-Bindungen für yyjson |
Dokumentationsseite hinzufügen.
GitHub-Workflow für CI und Codecov hinzufügen.
Weitere Tests hinzufügen: Valgrind, Sanitizer, Fuzzing.
Unterstützt JSON-Zeiger zum Abfragen und Ändern von JSON.
RAW
Typ für JSON-Reader und -Writer hinzufügen.
Option hinzufügen, um die Genauigkeit der Ausgabe reeller Zahlen zu begrenzen.
Option zur Unterstützung von JSON5 hinzufügen (falls möglich).
Fügen Sie Funktionen hinzu, um zwei JSON-Dokumente zu unterscheiden.
Fügen Sie Dokumentation zu Leistungsoptimierungen hinzu.
Sorgen Sie für ABI-Stabilität.
Dieses Projekt wird unter der MIT-Lizenz veröffentlicht.