JSON обработка в C++ с библиотекой nlohmann/json
В современной разработке на C++ работа с JSON (JavaScript Object Notation) стала неотъемлемой частью при создании веб-сервисов, конфигурационных файлов и обмена данными между системами. Одной из самых популярных и удобных библиотек для этой задачи является nlohmann/json (или просто JSON for Modern C++). Она предлагает интуитивно понятный API, минималистичный синтаксис и высокую производительность. В этой статье мы подробно разберём, как использовать эту библиотеку для парсинга, создания, модификации и сериализации JSON-данных на C++.
Установка и подключение
Библиотека nlohmann/json является header-only (состоит только из заголовочных файлов). Для её установки достаточно скачать один файл json.hpp с официального репозитория и подключить его в проекте:
#include <nlohmann/json.hpp>
using json = nlohmann::json;
Если вы используете CMake, можно подключить библиотеку через FetchContent или vcpkg. Пример для CMake:
FetchContent_Declare(json
GIT_REPOSITORY https://github.com/nlohmann/json.git
GIT_TAG v3.11.2)
FetchContent_MakeAvailable(json)
target_link_libraries(your_project PRIVATE nlohmann_json::nlohmann_json)
Основные возможности библиотеки
- Парсинг JSON из строки или файла – преобразование текста в структурированные данные.
- Создание JSON-объектов – динамическое формирование структур с помощью операторов
[]и методов. - Доступ к данным – чтение значений по ключам и индексам с проверкой типов.
- Сериализация – преобразование объекта JSON обратно в строку с форматированием.
- Работа с массивами и вложенными объектами – поддержка сложных иерархических структур.
- Обработка ошибок – исключения при неверных данных или типах.
Пример 1: Парсинг и чтение данных
Разберём простой пример: у нас есть строка с JSON, содержащая информацию о пользователе. Парсим её и извлекаем значения:
#include <iostream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
int main() {
std::string json_str = R"(
{
"name": "Иван",
"age": 30,
"is_student": false,
"hobbies": ["чтение", "программирование", "спорт"]
}
)";
// Парсинг строки в объект json
json user = json::parse(json_str);
// Доступ к данным с проверкой типа
std::string name = user["name"];
int age = user["age"];
bool is_student = user["is_student"];
std::cout << "Имя: " << name << std::endl;
std::cout << "Возраст: " << age << std::endl;
std::cout << "Студент: " << (is_student ? "да" : "нет") << std::endl;
// Работа с массивом
auto& hobbies = user["hobbies"];
std::cout << "Хобби: ";
for (const auto& hobby : hobbies) {
std::cout << hobby << " ";
}
std::cout << std::endl;
return 0;
}
Пример 2: Создание и сериализация JSON
Часто требуется сформировать JSON-структуру программно. Следующий код создаёт объект с данными о книге и выводит его в отформатированном виде:
#include <iostream>
#include <nlohmann/json.hpp>
using json = nlohmann::json;
int main() {
// Создаём пустой объект
json book;
// Заполняем данные
book["title"] = "Война и мир";
book["author"] = "Лев Толстой";
book["year"] = 1869;
book["genres"] = {"роман", "историческая литература"};
// Вложенный объект
book["publisher"]["name"] = "Эксмо";
book["publisher"]["city"] = "Москва";
// Сериализация с отступами (pretty print)
std::string formatted = book.dump(4); // 4 пробела для отступа
std::cout << "Форматированный JSON:\n" << formatted << std::endl;
// Компактный вывод (без пробелов)
std::string compact = book.dump();
std::cout << "\nКомпактный JSON:\n" &