Головной-only парсер/генератор JSON в C++20. Поддерживает как SAX, так и DOM стили API.
Исследуйте документацию »
Просмотреть демонстрацию
·
Сообщить об ошибке
·
Запросить новую функцию
Этот простой пример парсит 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"
}
]
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 | Размер | Описание |
---|---|---|
canada.json источник
|
2199КБ | Обводка границ Канады в формате GeoJSON. Содержит множество вещественных чисел. |
citm_catalog.json источник
|
1737КБ | Большой файл для бенчмарка с отступами, используемый в нескольких тестах парсеров JSON на Java. |
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://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 )