Высокопроизводительная библиотека JSON, написанная на ANSI C.
Быстро : может читать или записывать данные JSON со скоростью гигабайт в секунду на современных процессорах.
Портативный : соответствует стандарту ANSI C (C89) для кроссплатформенной совместимости.
Строгий : соответствует стандарту RFC 8259 JSON, обеспечивая строгий формат чисел и проверку UTF-8.
Расширяемый : предлагает опции для разрешения комментариев, конечных запятых, NaN/Inf и настраиваемого распределителя памяти.
Точность : может точно читать и писать числа int64
, uint64
и double
.
Гибкость : поддерживает неограниченное количество уровней вложенности JSON, символы u0000
и строки без нулевого завершения.
Манипуляция : поддерживает запросы и изменения с помощью JSON Pointer, JSON Patch и JSON Merge Patch.
Удобство для разработчиков : простая интеграция с использованием всего одного файла h
и одного файла c
.
Массив или объект хранится в виде структуры данных, такой как связанный список, что делает доступ к элементам по индексу или ключу медленнее, чем при использовании итератора.
В объекте разрешены дубликаты ключей, при этом порядок ключей сохраняется.
Результат анализа JSON является неизменяемым, поэтому для модификации требуется mutable copy
.
Тестовый проект и набор данных: yyjson_benchmark
Новый API-интерфейс Simdjson On Demand
работает быстрее, если большинство полей JSON известны во время компиляции. Этот проект тестирования проверяет только DOM API, новый тест будет добавлен позже.
twitter.json | анализ (ГБ/с) | строковое преобразование (ГБ/с) |
---|---|---|
yyjson (внутри) | 1,80 | 1,51 |
юйсон | 1,72 | 1,42 |
Симджсон | 1,52 | 0,61 |
Сайсон | 1.16 | |
RapidJSON (внутри) | 0,77 | |
RapidJSON (UTF8) | 0,26 | 0,39 |
cjson | 0,32 | 0,17 |
Янссон | 0,05 | 0,11 |
twitter.json | анализ (ГБ/с) | строковое преобразование (ГБ/с) |
---|---|---|
yyjson (внутри) | 3.51 | 2.41 |
юйсон | 2.39 | 2.01 |
Симджсон | 2.19 | 0,80 |
Сайсон | 1,74 | |
RapidJSON (внутри) | 0,75 | |
RapidJSON (UTF8) | 0,30 | 0,58 |
cjson | 0,48 | 0,33 |
Янссон | 0,09 | 0,24 |
Дополнительные отчеты о тестах с интерактивными диаграммами (обновление от 12 декабря 2020 г.)
Платформа | Процессор | Компилятор | ОС | Отчет |
---|---|---|---|---|
Интел НУК 8i5 | Core i5-8259U | мсвк 2019 | Windows 10 2004 г. | Графики |
Интел НУК 8i5 | Core i5-8259U | лязг 10.0 | Убунту 20.04 | Графики |
Интел НУК 8i5 | Core i5-8259U | ГЦК 9.3 | Убунту 20.04 | Графики |
AWS EC2 c5a.large | AMD ЭПИК 7R32 | ГЦК 9.3 | Убунту 20.04 | Графики |
AWS EC2 t4g.средний | Гравитон2 (ARM64) | ГЦК 9.3 | Убунту 20.04 | Графики |
Яблоко Айфон 12 Про | А14 (ARM64) | лязг 12.0 | iOS 14 | Графики |
Современный процессор с:
параллелизм высокого уровня команд
отличный предсказатель ветвей
низкий штраф за некорректный доступ к памяти
Современный компилятор с хорошим оптимизатором (например clang)
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);// Получить 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 ));// Получаем root["star"]yyjson_val *star = yyjson_obj_get(root, "star");printf("star: %dn", (int)yyjson_get_int(star));// Получаем root["hits"], перебираем массивyyjson_val *hits = yyjson_obj_get(root, "hits");size_t idx, max;yyjson_val *hit;yyjson_arr_foreach(хиты, idx, макс, хит) {printf("hit%d: %dn", (int)idx, (int)yyjson_get_int(hit)); }// Освободите 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 ); // {"name":"Mash","star":4,"hits":[2,2,1,3]}free((void *)json); }// Освободите docyyjson_mut_doc_free(doc);
// Читаем файл JSON, разрешая комментарии и заканчивая запятыми.yjson_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);// Перебираем корневой объектif (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) ;// Удалять нулевые значения в корневом объекте yyyjson_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("ошибка записи (%u): %sn", err.code, ошибка.msg); }// Освободите docyyjson_doc_free(idoc);yyjson_mut_doc_free(doc);
Последнюю (неизданную) документацию можно найти в каталоге doc. Предварительно созданный HTML-код Doxygen для релизной версии можно просмотреть здесь:
Домашняя страница
Сборка и тестирование
API и пример кода
Структура данных
Журнал изменений
Неисчерпывающий список проектов, которые предоставляют yyjson другим языкам или используют yyjson внутри страны для реализации основных функций. Если у вас есть проект, использующий yyjson, смело открывайте PR, чтобы добавить его в этот список.
Проект | Язык | Описание |
---|---|---|
py_yyjson | Питон | Привязки Python для yyjson |
Орджсон | Питон | Библиотека JSON для Python с дополнительным бэкэндом yyjson |
cpp-yyjson | С++ | Библиотека C++ JSON с серверной частью yyjson |
отражение-cpp | С++ | Библиотека C++ для сериализации посредством автоматического получения имен полей из структур. |
yyjsonr | Р | Привязка R для yyjson |
Ананда | Быстрый | Декодирование модели JSON на основе yyjson |
уткадб | С++ | DuckDB — это внутрипроцессная система управления базами данных SQL OLAP. |
быстрая выборка | С | Инструмент, похожий на neofetch, для получения системной информации и ее красивого отображения. |
Зритм | С | Рабочая станция цифрового аудио, которая использует yyjson для сериализации файлов проекта JSON. |
быть более человечным | С | Механизм рекомендаций с акцентом на уникальность человека, получившего отзыв |
Мруби-Йийсон | Мруби | Эффективная библиотека синтаксического анализа и сериализации JSON для mruby с использованием yyjson |
YYJSON.jl | Юлия | Юлия привязок для yyjson |
Добавить страницу документации.
Добавьте рабочий процесс GitHub для CI и codecov.
Добавьте больше тестов: valgrind, санитайзер, фаззинг.
Поддержка указателя JSON для запроса и изменения JSON.
Добавьте тип RAW
для чтения и записи JSON.
Добавьте опцию для ограничения точности вывода действительных чисел.
Добавьте опцию поддержки JSON5 (если это возможно).
Добавьте функции для сравнения двух документов JSON.
Добавьте документацию по оптимизации производительности.
Обеспечьте стабильность ABI.
Этот проект выпущен под лицензией MIT.