Une bibliothèque JSON haute performance écrite en ANSI C.
Rapide : peut lire ou écrire des données JSON en gigaoctets par seconde sur les processeurs modernes.
Portable : conforme à la norme ANSI C (C89) pour une compatibilité multiplateforme.
Strict : conforme à la norme RFC 8259 JSON, garantissant un format numérique strict et une validation UTF-8.
Extensible : offre des options pour autoriser les commentaires, les virgules de fin, NaN/Inf et un allocateur de mémoire personnalisé.
Précision : peut lire et écrire avec précision des nombres int64
, uint64
et double
.
Flexible : prend en charge des niveaux d'imbrication JSON illimités, des caractères u0000
et des chaînes non terminées par un caractère nul.
Manipulation : prend en charge les requêtes et les modifications à l'aide du pointeur JSON, du correctif JSON et du correctif de fusion JSON.
Adapté aux développeurs : intégration facile avec un seul fichier h
et un fichier c
.
Un tableau ou un objet est stocké sous forme de structure de données telle qu'une liste chaînée, ce qui rend l'accès aux éléments par index ou par clé plus lent que l'utilisation d'un itérateur.
Les clés en double sont autorisées dans un objet et l'ordre des clés est conservé.
Le résultat de l'analyse JSON est immuable, nécessitant une mutable copy
pour la modification.
Projet de référence et ensemble de données : yyjson_benchmark
La nouvelle API On Demand
de simdjson est plus rapide si la plupart des champs JSON sont connus au moment de la compilation. Ce projet de benchmark vérifie uniquement l'API DOM, un nouveau benchmark sera ajouté ultérieurement.
twitter.json | analyser (Go/s) | stringifier (Go/s) |
---|---|---|
yyjson(insitu) | 1,80 | 1,51 |
yyjson | 1,72 | 1,42 |
simdjson | 1,52 | 0,61 |
sajson | 1.16 | |
rapidjson(insitu) | 0,77 | |
rapidejson(utf8) | 0,26 | 0,39 |
cjson | 0,32 | 0,17 |
Jansson | 0,05 | 0,11 |
twitter.json | analyser (Go/s) | stringifier (Go/s) |
---|---|---|
yyjson(insitu) | 3.51 | 2.41 |
yyjson | 2,39 | 2.01 |
simdjson | 2.19 | 0,80 |
sajson | 1,74 | |
rapidjson(insitu) | 0,75 | |
rapidejson(utf8) | 0,30 | 0,58 |
cjson | 0,48 | 0,33 |
Jansson | 0,09 | 0,24 |
Plus de rapports de référence avec des graphiques interactifs (mise à jour 2020-12-12)
Plate-forme | Processeur | Compilateur | Système d'exploitation | Rapport |
---|---|---|---|---|
Intel NUC 8i5 | Core i5-8259U | MSVC 2019 | Windows 10 2004 | Graphiques |
Intel NUC 8i5 | Core i5-8259U | bruit 10.0 | Ubuntu 20.04 | Graphiques |
Intel NUC 8i5 | Core i5-8259U | gcc 9.3 | Ubuntu 20.04 | Graphiques |
AWS EC2 c5a.large | AMD EPYC7R32 | gcc 9.3 | Ubuntu 20.04 | Graphiques |
AWS EC2 t4g.medium | Graviton2 (ARM64) | gcc 9.3 | Ubuntu 20.04 | Graphiques |
Apple iPhone 12 Pro | A14 (ARM64) | bruit 12.0 | iOS 14 | Graphiques |
Un processeur moderne avec :
parallélisme de haut niveau d'instruction
excellent prédicteur de branche
faible pénalité pour un accès mémoire mal aligné
Un compilateur moderne avec un bon optimiseur (par exemple clang)
const char *json = "{"name":"Mash","star":4,"hits":[2,2,1,3]}";// Lisez JSON et obtenez rootyyjson_doc *doc = yyjson_read(json , strlen(json), 0);yyjson_val *root = yyjson_doc_get_root(doc);// Obtenir 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));// Obtenir root["star "]yyjson_val *star = yyjson_obj_get(root, "star");printf("star: %dn", (int)yyjson_get_int(star));// Obtenez root["hits"], parcourez le tableauyyjson_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)); }// Libérez le docyyjson_doc_free(doc);// Toutes les fonctions acceptent l'entrée NULL et renvoient NULL en cas d'erreur.
// Créer un docyyjson_mut_doc *doc = yyjson_mut_doc_new(NULL);yyjson_mut_val *root = yyjson_mut_obj(doc);yyjson_mut_doc_set_root(doc, root);// Définir root["name"] et root["star"]yyjson_mut_obj_add_str(doc, racine, "nom", "Mash");yyjson_mut_obj_add_int(doc, root, "star", 4);// Définir root["hits"] avec un tableauint 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);// Vers une chaîne, 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); }// Libérez le docyyjson_mut_doc_free(doc);
// Lire le fichier JSON, autorisant les commentaires et les virgules de fin yyjson_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);// Itérer sur l'objectif racine (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("erreur de lecture (%u) : %s à la position : %ldn", err.code, err.msg, err.pos); }// Libérez le docyyjson_doc_free(doc);
// Lire le fichier JSON en tant que docyyjson_doc mutable *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) ;// Supprimer les valeurs nulles à la racine 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); } }// Écrivez joliment le json, échappez à 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("erreur d'écriture (%u): %sn", err.code, err.msg); }// Libérez le docyyjson_doc_free(idoc);yyjson_mut_doc_free(doc);
La dernière documentation (inédite) est accessible dans le répertoire doc. Le code HTML Doxygen pré-généré pour la version finale peut être consulté ici :
Page d'accueil
Construire et tester
API et exemple de code
Structure des données
Journal des modifications
Une liste non exhaustive de projets qui exposent yyjson à d'autres langages ou utilisent yyjson en interne pour une fonctionnalité majeure. Si vous avez un projet qui utilise yyjson, n'hésitez pas à ouvrir un PR pour l'ajouter à cette liste.
Projet | Langue | Description |
---|---|---|
py_yyjson | Python | Liaisons Python pour yyjson |
orjson | Python | Bibliothèque JSON pour Python avec un backend yyjson en option |
cpp-yyjson | C++ | Bibliothèque C++ JSON avec un backend yyjson |
réfléchir-cpp | C++ | Bibliothèque C++ pour la sérialisation via la récupération automatisée des noms de champs à partir des structures |
yyjsonr | R. | Liaison R pour yyjson |
Ananda | Rapide | Décodage du modèle JSON basé sur yyjson |
canarddb | C++ | DuckDB est un système de gestion de base de données SQL OLAP en cours |
récupération rapide | C | Un outil de type neofetch pour récupérer les informations système et les afficher de manière jolie |
Zrythme | C | Station de travail audio numérique qui utilise yyjson pour sérialiser les fichiers de projet JSON |
devenir plus humain | C | Moteur de recommandation axé sur le caractère unique de la personne recevant la recommandation |
mruby-yyjson | mruby | Bibliothèque d'analyse et de sérialisation JSON efficace pour mruby utilisant yyjson |
YYJSON.jl | Julie | Reliures Julia pour yyjson |
Ajouter une page de documentation.
Ajoutez le workflow GitHub pour CI et codecov.
Ajoutez plus de tests : valgrind, désinfectant, fuzzing.
Prend en charge le pointeur JSON pour interroger et modifier JSON.
Ajoutez le type RAW
pour le lecteur et l'écrivain JSON.
Ajouter une option pour limiter la précision de sortie des nombres réels.
Ajoutez une option pour prendre en charge JSON5 (si possible).
Ajoutez des fonctions pour comparer deux documents JSON.
Ajoutez de la documentation sur les optimisations de performances.
Assurer la stabilité de l’ABI.
Ce projet est publié sous licence MIT.