Парсер/генератор JSON на C++20
Исследуйте документацию »
Просмотреть демо
·
Сообщить об ошибке
·
Запросить новую функцию
Переводы: Английский | Упрощённый китайский
neujson — это парсер и генератор JSON на C++. Он поддерживает как API стиля SAX, так и стиля DOM.
git clone https://github.com/hominsu/neujson.git
```### Компиляция и установка
Далее приведены команды для локальной компиляции и установки neujson:
```bash
cd neujson
mkdir -p cmake/build
pushd cmake/build
cmake ../..
make -j
make install
popd
Если у вас нет прав доступа к каталогу установки, используйте sudo
:
sudo make install
Исходный код примеров уже включен в исходный код neujson
. Вы уже клонировали исходный код в предыдущем шаге, поэтому вам просто нужно будет добавить один параметр cmake
:
cmake -DNEUJSON_BUILD_EXAMPLES=ON ../..
Для сборки бенчмарков вам потребуется использовать git submodule
, чтобы получить внешние зависимости, а затем вы должны будете выбрать соответствующую ветку и добавить параметр cmake
для сборки бенчмарков:
git submodule update --init --recursive
pushd cmake/build
cmake -DNEUJSON_BUILD_BENCHMARK=ON ../..
...
Чтобы удалить neujson
, используйте следующие команды:
pushd cmake/build
make uninstall
popd
Если у вас нет прав доступа к каталогу установки, используйте sudo
:
sudo make uninstall
Этот простой пример демонстрирует парсинг JSON строки в объект 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 const 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().size()), os.get().c_str());
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"
}
]
Бенчмарки производительности основаны на google benchmark
Файл JSON | Размер | Описание |
---|---|---|
canada.json источник
|
2199КБ | Контур границы Канады в формате GeoJSON; содержит большое количество вещественных чисел. |
citm_catalog.json источник
|
1737КБ | Большой тестовый файл с отступами для бенчмарка нескольких Java JSON-парсеров. |
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 мс 167
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, системы CentOS-8-Stream и компилятора gcc 8. 5. 0 (Red Hat 8. 5. 0-10).
Запущено на (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_nlohmann_read_parse_write_file/канада.json 53,5 мс 53,4 мс 13
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). Любые формы вклада приветствуются!
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )