Una biblioteca JSON de alto rendimiento escrita en ANSI C.
Rápido : puede leer o escribir gigabytes por segundo de datos JSON en CPU modernas.
Portátil : cumple con ANSI C (C89) para compatibilidad multiplataforma.
Estricto : cumple con el estándar RFC 8259 JSON, lo que garantiza un formato de número estricto y validación UTF-8.
Ampliable : ofrece opciones para permitir comentarios, comas finales, NaN/Inf y asignador de memoria personalizado.
Precisión : puede leer y escribir con precisión números int64
, uint64
y double
.
Flexible : admite niveles de anidamiento JSON ilimitados, u0000
caracteres y cadenas no terminadas en nulo.
Manipulación : admite consultas y modificaciones mediante JSON Pointer, JSON Patch y JSON Merge Patch.
Fácil de usar para desarrolladores : fácil integración con solo un archivo h
y un archivo c
.
Una matriz u objeto se almacena como una estructura de datos, como una lista vinculada, lo que hace que el acceso a elementos por índice o clave sea más lento que usar un iterador.
Se permiten claves duplicadas en un objeto y se conserva el orden de las claves.
El resultado del análisis JSON es inmutable y requiere una mutable copy
para su modificación.
Proyecto de referencia y conjunto de datos: yyjson_benchmark
La nueva API On Demand
de simdjson es más rápida si la mayoría de los campos JSON se conocen en tiempo de compilación. Este proyecto de referencia solo verifica la API DOM; más adelante se agregará un nuevo punto de referencia.
twitter.json | analizar (GB/s) | cadenar (GB/s) |
---|---|---|
yyjson(insitu) | 1,80 | 1.51 |
yyjson | 1,72 | 1.42 |
simdjson | 1,52 | 0,61 |
sajón | 1.16 | |
rapidjson(insitu) | 0,77 | |
rapidjson(utf8) | 0,26 | 0,39 |
cjson | 0,32 | 0,17 |
jansson | 0,05 | 0,11 |
twitter.json | analizar (GB/s) | cadenar (GB/s) |
---|---|---|
yyjson(insitu) | 3.51 | 2.41 |
yyjson | 2.39 | 2.01 |
simdjson | 2.19 | 0,80 |
sajón | 1.74 | |
rapidjson(insitu) | 0,75 | |
rapidjson(utf8) | 0,30 | 0,58 |
cjson | 0,48 | 0,33 |
jansson | 0,09 | 0,24 |
Más informes de referencia con gráficos interactivos (actualización 2020-12-12)
Plataforma | UPC | Compilador | SO | Informe |
---|---|---|---|---|
Intel NUC 8i5 | Núcleo i5-8259U | msvc 2019 | Ventanas 10 2004 | Gráficos |
Intel NUC 8i5 | Núcleo i5-8259U | sonido metálico 10.0 | ubuntu 20.04 | Gráficos |
Intel NUC 8i5 | Núcleo i5-8259U | gcc 9.3 | ubuntu 20.04 | Gráficos |
AWS EC2 c5a.grande | AMD EPYC 7R32 | gcc 9.3 | ubuntu 20.04 | Gráficos |
AWS EC2 t4g.medio | Gravitón2 (ARM64) | gcc 9.3 | ubuntu 20.04 | Gráficos |
iPhone 12 Pro | A14 (BRAZO64) | sonido metálico 12.0 | iOS 14 | Gráficos |
Un procesador moderno con:
paralelismo de alto nivel de instrucción
excelente predictor de ramas
penalización baja por acceso a memoria desalineado
Un compilador moderno con un buen optimizador (por ejemplo, clang)
const char *json = "{"name":"Mash","star":4,"hits":[2,2,1,3]}";// Lee JSON y obtiene rootyyjson_doc *doc = yyjson_read(json , strlen(json), 0);yyjson_val *root = yyjson_doc_get_root(doc);// Obtener raíz["nombre"]yyjson_val *nombre = yyjson_obj_get(root, "nombre");printf("nombre: %sn", yyjson_get_str(nombre));printf("longitud del nombre:%dn", (int)yyjson_get_len(nombre));// Obtener raíz["estrella "]yyjson_val *estrella = yyjson_obj_get(raíz, "estrella");printf("estrella: %dn", (int)yyjson_get_int(star));// Obtener root["hits"], iterar sobre la matrizyyjson_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)); }// Libera docyyjson_doc_free(doc);// Todas las funciones aceptan entradas NULL y devuelven NULL en caso de error.
// Crea 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);// Establece root["name"] y root["star"]yyjson_mut_obj_add_str(doc, raíz, "nombre", "Mash");yyjson_mut_obj_add_int(doc, root, "star", 4);// Establece root["hits"] con un arrayint hits_arr[] = {2, 2, 1, 3};yyjson_mut_val *hits = yyjson_mut_arr_with_sint32( documento, hits_arr, 4);yyjson_mut_obj_add_val(doc, root, "hits", hits);// A cadena, 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); }// Libera docyyjson_mut_doc_free(doc);
// Lee el archivo JSON, permitiendo comentarios y comas finalesyyjson_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);// Iterar sobre el objetivo raíz (doc) {yyjson_val *obj = yyjson_doc_get_root(doc);yyjson_obj_iter iter;yyjson_obj_iter_init(obj, &iter);yyjson_val *clave, *val;mientras ((clave = yyjson_obj_iter_next(&iter))) {val = yyjson_obj_iter_get_val(clave);printf("%s: %sn", yyjson_get_str(clave), yyjson_get_type_desc(val)); } } else {printf("error de lectura (%u): %s en la posición: %ldn", err.code, err.msg, err.pos); }// Libera docyyjson_doc_free(doc);
// Lee el archivo JSON como un 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) ;// Eliminar valores nulos en la raíz 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); } }// Escribe el json bonito, escapa 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("escribir error (%u): %sn", err.code, err.msg); }// Libera docyyjson_doc_free(idoc);yyjson_mut_doc_free(doc);
Se puede acceder a la documentación más reciente (inédita) en el directorio doc. El HTML de Doxygen pregenerado para la versión de lanzamiento se puede ver aquí:
Página de inicio
Construir y probar
API y código de muestra
estructura de datos
Registro de cambios
Una lista no exhaustiva de proyectos que exponen yyjson a otros lenguajes o usan yyjson internamente para una característica importante. Si tiene un proyecto que usa yyjson, no dude en abrir un PR para agregarlo a esta lista.
Proyecto | Idioma | Descripción |
---|---|---|
py_yyjson | Pitón | Enlaces de Python para yyjson |
orjson | Pitón | Biblioteca JSON para Python con un backend yyjson opcional |
cpp-yyjson | C++ | Biblioteca C++ JSON con un backend yyjson |
reflejar-cpp | C++ | Biblioteca C++ para serialización mediante la recuperación automatizada de nombres de campos desde estructuras |
yyjsonr | R | Enlace R para yyjson |
Ananda | Rápido | Decodificación del modelo JSON basada en yyjson |
patodb | C++ | DuckDB es un sistema de gestión de bases de datos SQL OLAP en proceso |
búsqueda rápida | do | Una herramienta similar a neofetch para obtener información del sistema y mostrarla de una manera bonita. |
Zritmo | do | Estación de trabajo de audio digital que utiliza yyjson para serializar archivos de proyecto JSON |
ser más humano | do | Motor de recomendaciones centrado en la singularidad de la persona que recibe la recomendación. |
mruby-yyjson | mruby | Biblioteca eficiente de serialización y análisis JSON para mruby usando yyjson |
YYJSON.jl | Julia | Fijaciones Julia para yyjson. |
Agregar página de documentación.
Agregue el flujo de trabajo de GitHub para CI y codecov.
Agregue más pruebas: valgrind, sanitizer, fuzzing.
Admite puntero JSON para consultar y modificar JSON.
Agregue tipo RAW
para lector y escritor JSON.
Agregue una opción para limitar la precisión de salida de números reales.
Agregue una opción para admitir JSON5 (si es posible).
Agregue funciones para diferenciar dos documentos JSON.
Agregue documentación sobre optimizaciones de rendimiento.
Garantizar la estabilidad del ABI.
Este proyecto está publicado bajo la licencia MIT.