1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/hominsu-neujson

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 19 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 12.03.2025 11:17 0efcb7b

Участники Репозитории Звезды Проблемы Лицензия Выгрузка


neujson

Головной-only парсер/генератор JSON в C++20. Поддерживает как SAX, так и DOM стили API.
Исследуйте документацию »

Просмотреть демонстрацию · Сообщить об ошибке · Запросить новую функцию

Переведено с: 简体中文## Основные возможности
  • Простой, быстрый. Neujson состоит только из заголовочных файлов, не зависит от Boost и полностью использует возможности шаблонов. Вы можете свободно "собирать" обработчики neujson.
  • Простота API. Neujson поддерживает как DOM, так и API в стиле SAX, где SAX позволяет использовать пользовательские обработчики для потоковой обработки.
  • Дружественный к Unicode. Neujson полностью поддерживает кодировку UTF-8 и может парсировать символы типа '\u0000'.
  • Несколько входных/выходных потоков. Neujson имеет встроенные потоки ввода/вывода строк и файлов, а также использует буферы памяти для повышения скорости чтения и записи.
  • Обёртки STD Streams. Neujson предоставляет официальные обёртки для std::istream и std::ostream, что позволяет объединять их с встроенными потоками ввода/вывода neujson.
  • Высокопроизводительный. Внутри neujson реализует стандарты, такие как IEEE754, и использует высокоэффективные алгоритмы, встроенные в различные компиляторы. Neujson планирует внедрение алгоритма Grisu2 и использование инструкций SIMD для ускорения преобразования между вещественными числами и строками.

Примеры### Быстрый взгляд на использование

Этот простой пример парсит JSON-строку в документ (DOM), выполняет простое изменение DOM, а затем сериализует DOM обратно в JSON-строку.

#include <cstdio>

#include "neujson/document.h"
#include "neujson/string_write_stream.h"
#include "neujson/writer.h"
#include "sample.h"

int main() {
  // 1. Парсим JSON-строку в DOM.
  neujson::Document doc;
  if (auto err = doc.Parse(kSample[0]); err != neujson::error::OK) {
    puts(neujson::ParseErrorStr(err));
    return EXIT_FAILURE;
  }

  // 2. Изменяем его с помощью DOM.
  auto& s = doc[0]["Longitude"];
  s.SetDouble(s.GetDouble() + 100.0);

  // 3. Сериализуем DOM
  neujson::StringWriteStream os;
  neujson::Writer writer(os);
  doc.WriteTo(writer);

  // Вывод
  fprintf(stdout, "%.*s", static_cast<int>(os.get().length()), os.get().data());
  return 0;
}

Выход:

[
  {
    "precision": "zip",
    "Latitude": 37.7668,
    "Longitude": -22.3959,
    "Address": "",
    "City": "SAN FRANCISCO",
    "State": "CA",
    "Zip": "94107",
    "Country": "US"
  },
  {
    "precision": "zip",
    "Latitude": 37.371991,
    "Longitude": -122.02602,
    "Address": "",
    "City": "SUNNYVALE",
    "State": "CA",
    "Zip": "94085",
    "Country": "US"
  }
]

Сборка

Клонируем репозиторий neujson

git clone https://github.com/hominsu/neujson.git

Сборка

Для сборки этого проекта требуется C++17. Эта библиотека использует следующие проекты:

При сборке тестов:

При сборке примеров:

Все зависимости автоматически получены от GitHub во время сборки, поэтому вам не нужно дополнительно конфигурировать их.

С использованием типов сборки CMake вы можете контролировать, собираются ли примеры и тесты.```bash cmake -H. -Bbuild
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_PREFIX=/Users/hominsu/utils/install
-DNEUJSON_BUILD_EXAMPLES=ON
-DNEUJSON_BUILD_TESTS=ON cmake --build ./build --parallel $(nproc) ctest -VV --test-dir ./build/ --output-on-failure cmake --install ./build


```bash
cmake -H. -Bbuild \
	-DNEUJSON_BUILD_EXAMPLES=OFF \
	-DNEUJSON_BUILD_TESTS=OFF
cmake --install ./build

Установка

cd build
make uninstall

Интеграция Найдено с помощью find_package в CMake.

find_package(neujson REQUIRED)
target_include_directories(foo PUBLIC ${neujson_INCLUDE_DIRS})

Бенчмарк

Чтобы собрать с бенчмарком, используйте git submodule, чтобы получить все данные из этого стороннего проекта и выберите соответствующий коммит, затем добавьте опцию CMake для бенчмарка:

git submodule update --init --recursive
pushd cmake/build
cmake -DNEUJSON_BUILD_BENCHMARK=ON ../..
...

Бенчмарк основан на Google Benchmark

JSON данные

Файл JSON Размер Описание
canada.json источник 2199КБ Обводка границ Канады в формате GeoJSON. Содержит множество вещественных чисел.
citm_catalog.json источник 1737КБ Большой файл для бенчмарка с отступами, используемый в нескольких тестах парсеров JSON на Java.

Примеры результатовСледующие являются некоторыми снимками экрана результатов на MacBook Air (M1, 2020) с Apple clang 13. 1. 6```bash

Запущено на (8 x 24. 1212 МГц процессора) CPU Кэши: L1 Данные 64 КиБ (x8) L1 Инструкция 128 КиБ (x8) L2 Общий 4096 КиБ (x2) Среднее значение загрузки: 2. 04, 1. 78, 1. 74

Benchmark Время Процессор Итерации

BM_neujson_read_parse/citm_catalog.json 7. 04 мс 7. 04 мс 72 BM_nlohmann_read_parse/citm_catalog.json 10. 6 мс 10. 6 мс 66 BM_rapidjson_read_parse/citm_catalog.json 2. 96 мс 2. 96 мс 236 BM_neujson_read_parse_write_file/citm_catalog.json 7. 92 мс 7. 92 мс 88 BM_nlohmann_read_parse_write_file/citm_catalog.json 12. 5 мс 12. 5 мс 56 BM_rapidjson_read_parse_write_file/citm_catalog.json 4. 10 мс 4. 10 мс 170 BM_neujson_read_parse_write_string/citm_catalog.json 8. 03 мс 8. 03 мс 87 BM_nlohmann_read_parse_write_string/citm_catalog.json 12. 7 мс 12. 7 мс 55 BM_rapidjson_read_parse_write_string/citm_catalog.json 3. 90 мс 3. 90 мс 180 BM_neujson_read_parse_pretty_write_file/citm_catalog.json 8. 84 мс 8. 84 мс 79 BM_nlohmann_read_parse_pretty_write_file/citm_catalog.json 13. 3 мс 13. 3 мс 53 BM_rapidjson_read_parse_pretty_write_file/citm_catalog.json 4. 56 мс 4. 55 мс 154 BM_neujson_read_parse_pretty_write_string/citm_catalog.json 9. 44 мс 9. 44 мс 72 BM_nlohmann_read_parse_pretty_write_string/citm_catalog.json 14. 2 мс 14. 2 мс 50 BM_rapidjson_read_parse_pretty_write_string/citm_catalog.json 4. 19 мс 4. 19 мс 146

BM_neujson_read_parse/canada.json                                    31.6 мс         31.6 мс           22
BM_nlohmann_read_parse/canada.json                                   39.1 мс         39.1 мс           18
BM_rapidjson_read_parse/canada.json                                  3.38 мс         3.38 мс          207
BM_neujson_read_parse_write_file/canada.json                         68.2 мс          68.2 мс              10
BM_nlohmann_read_parse_write_file/канада.json                        47.6 мс          47.6 мс              15
BM_rapidjson_read_parse_write_file/канада.json                       12.5 мс          12.5 мс              55
BM_neujson_read_parse_write_string/канада.json                       69.4 мс          69.4 мс              10
BM_nlohmann_read_parse_write_string/канада.json                      48.5 мс          48.5 мс              14
BM_rapidjson_read_parse_write_string/канада.json                     10.7 мс          10.7 мс              63
BM_neujson_read_parse_pretty_write_file/канада.json                  72.3 мс          72.3 мс              10
BM_nlohmann_read_parse_pretty_write_file/канада.json                 51.2 мс          51.2 мс              14
BM_rapidjson_read_parse_pretty_write_file/канада.json                13.7 мс          13.7 мс              51
BM_neujson_read_parse_pretty_write_string/канада.json                75.9 мс          75.9 мс               9
BM_nlohmann_read_parse_pretty_write_string/канада.json               55.0 мс          55.0 мс              13
BM_rapidjson_read_parse_pretty_write_string/канада.json              12.4 мс          12.4 мс              56
```Следующие снимки экрана получены в результате работы процессора i5-9500 с компилятором gcc 8.5.0 (Red Hat 8.5.0-10) в CentOS-8-Stream```bash
Запущено на (6 X 4166.48 МГц процессора)
CPU Кэши:
L1 Данные 32 КБ (x6)
L1 Инструкция 32 КБ (x6)
L2 Общий 256 КБ (x6)
L3 Общий 9216 КБ (x1)
Среднее значение загрузки: 0.80, 0.52, 0.45
--------------------------------------------------------------------------------------------------------Benchmark                                                              Время             Процессор       Итерации
--------------------------------------------------------------------------------------------------------
BM_neujson_read_parse/citm_catalog.json                                8.59 мс           8.58 мс            74
BM_nlohmann_read_parse/citm_catalog.json                               14.7 мс           14.6 мс            48
BM_rapidjson_read_parse/citm_catalog.json                              2.38 мс           2.37 мс           293
BM_neujson_read_parse_write_file/citm_catalog.json                     10.1 мс           10.1 мс            70
BM_nlohmann_read_parse_write_file/citm_catalog.json                    17.5 мс           17.5 мс            40
BM_rapidjson_read_parse_write_file/citm_catalog.json                   3.39 мс           3.39 мс           206
BM_neujson_read_parse_write_string/citm_catalog.json                   10.9 мс           10.9 мс            65
BM_nlohmann_read_parse_write_string/citm_catalog.json                  17.5 мс           17.5 мс            40
BM_rapidjson_read_parse_write_string/citm_catalog.json                 3.20 мс           3.19 мс           218
BM_neujson_read_parse_pretty_write_file/citm_catalog.json              11.3 мс           11.3 мс            60
BM_nlohmann_read_parse_pretty_write_file/citm_catalog.json             18.8 мс           18.7 мс            38
BM_rapidjson_read_parse_pretty_write_file/citm_catalog.json            3.70 мс           3.69 мс           189
BM_neujson_read_parse_pretty_write_string/citm_catalog.json            14.5 мс           14.5 мс            49
BM_nlohmann_read_parse_pretty_write_string/citm_catalog.json           18.5 мс           18.5 мс            38
BM_rapidjson_read_parse_pretty_write_string/citm_catalog.json          3.57 мс           3.57 мс           196
BM_neujson_read_parse/canada.json                                       27.8 мс           27.7 мс            25
BM_nlohmann_read_parse/canada.json                                      41.8 мс           41.8 мс            17
BM_rapidjson_read_parse/canada.json                                     4.59 мс           4.58 мс           152

BM_neujson_read_parse_write_file/канада.json 100 мс 100 мс 7

BM_rapidjson_read_parse_write_file/канада.json                       13,6 мс         13,6 мс           51
BM_neujson_read_parse_write_string/канада.json                        106 мс          106 мс            7
BM_nlohmann_read_parse_write_string/канада.json                      53,3 мс         53,3 мс           13
BM_rapidjson_read_parse_write_string/канада.json                     11,9 мс         11,9 мс           58
BM_neujson_read_parse_pretty_write_file/канада.json                   106 мс          106 мс            7
BM_nlohmann_read_parse_pretty_write_file/канада.json                 58,6 мс         58,6 мс           12
BM_rapidjson_read_parse_pretty_write_file/канада.json                14,4 мс         14,4 мс           49
BM_neujson_read_parse_pretty_write_string/канада.json                 119 мс          119 мс            6
BM_nlohmann_read_parse_pretty_write_string/канада.json               64,9 мс         64,8 мс           11
BM_rapidjson_read_parse_pretty_write_string/канада.json              12,8 мс         12,8 мс           54
```## Ссылки[РapidJSON](https://github.com/Tencent/rapidjson): Быстрый парсер/генератор JSON для C++ с обоими API стиля SAX/DOM

## Отзывы

![Логотип JetBrains (Основной)](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg)

Особая благодарность [JetBrains](https://www.jetbrains.com/) за бесплатную лицензию `All Products Pack` для этого открытого проекта

## Вкладчики ✨

Большое спасибо этим замечательным людям ([ключ эмодзи](https://allcontributors.org/docs/en/emoji-key)):

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
  <tr>
    <td align="center"><a href="https://homing.so"><img src="https://avatars.githubusercontent.com/u/14991225?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Homing So</b></sub></a><br /><a href="https://github.com/hominsu/neujson/commits?author=hominsu" title="Код">💻</a> <a href="https://github.com/hominsu/neujson/commits?author=hominsu" title="Документация">📖</a> <a href="#design-hominsu" title="Проектирование">🎨</a> <a href="#example-hominsu" title="Примеры">💡</a> <a href="#infra-hominsu" title="Инфраструктура (хостинг, средства сборки и т.д.)">🚇</a> <a href="#platform-hominsu" title="Упаковка/перенос на новую платформу">📦</a> <a href="https://github.com/hominsu/neujson/commits?author=hominsu" title="Тестирование">⚠️</a></td>
  </tr>
</table>

<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->

<!-- ALL-CONTRIBUTORS-LIST:END -->

Этот проект следует спецификации [all-contributors](https://github.com/all-contributors/all-contributors). Любые вклады приветствуются!

## Лицензия

Размещено под лицензией MIT. Смотрите `LICENSE` для получения более подробной информации.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/hominsu-neujson.git
git@api.gitlife.ru:oschina-mirror/hominsu-neujson.git
oschina-mirror
hominsu-neujson
hominsu-neujson
main