JSON обработка в C++: библиотека nlohmann/json для работы с данными

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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" &                    

Рекомендаций