Работа с JSON в C++: парсинг и сериализация для начинающих

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

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

Начать курс

Введение: Зачем нужен JSON в C++?

JSON (JavaScript Object Notation) — это легковесный формат обмена данными, который широко используется в веб-приложениях, конфигурационных файлах и API. Несмотря на то, что JSON изначально появился в JavaScript, сегодня он стал стандартом де-факто для передачи структурированных данных между сервером и клиентом на любом языке программирования, включая C++.

В этой статье мы разберем, как работать с JSON в C++: парсить (читать) и сериализовать (создавать) JSON-данные. Материал ориентирован на начинающих разработчиков, которые уже знакомы с основами C++ (переменные, функции, классы), но еще не работали с JSON.

Для работы с JSON в C++ мы будем использовать популярную библиотеку nlohmann/json (также известную как JSON for Modern C++). Она проста в установке, интуитивно понятна и отлично подходит для обучения.

Установка библиотеки nlohmann/json

Прежде чем писать код, необходимо подключить библиотеку. Самый простой способ — использовать header-only версию (достаточно одного заголовочного файла).

Способ 1: Скачать файл json.hpp

  • Перейдите на GitHub-репозиторий nlohmann/json.
  • Скачайте файл json.hpp из последнего релиза.
  • Поместите его в папку с вашим проектом.
  • Подключите в коде: #include "json.hpp"

Способ 2: Использовать менеджер пакетов (vcpkg / Conan)

Если вы используете CMake, проще всего установить библиотеку через vcpkg:

vcpkg install nlohmann-json

Или через Conan:

conan install nlohmann_json/3.11.2@

После установки подключите библиотеку в коде:

#include <nlohmann/json.hpp>
using json = nlohmann::json;

Теперь вы готовы к работе!

Парсинг JSON в C++: чтение данных

Парсинг — это процесс преобразования строки JSON в объект, с которым можно работать в коде. Библиотека nlohmann/json делает это максимально просто.

Пример 1: Парсинг строки JSON

Допустим, у нас есть JSON-строка, содержащая информацию о пользователе:

{
  "name": "Алексей",
  "age": 30,
  "is_student": false,
  "hobbies": ["чтение", "программирование", "велосипед"]
}

Парсинг выполняется одной строкой:

#include <iostream>
#include <nlohmann/json.hpp>

using json = nlohmann::json;

int main() {
    // Исходная JSON-строка
    std::string json_str = R"(
    {
        "name": "Алексей",
        "age": 30,
        "is_student": false,
        "hobbies": ["чтение", "программирование", "велосипед"]
    }
    )";

    // Парсинг
    json data = json::parse(json_str);

    // Доступ к данным
    std::string name = data["name"];
    int age = data["age"];
    bool is_student = data["is_student"];
    std::vector<std::string> hobbies = data["hobbies"];

    // Вывод
    std::cout << "Имя: " << name << std::endl;
    std::cout << "Возраст: " << age << std::endl;
    std::cout << "Студент? " << (is_student ? "да" : "нет") << std::endl;
    std::cout << "Хобби: ";
    for (const auto& hobby : hobbies) {
        std::cout << hobby << " ";
    }
    std::cout << std::endl;

    return 0;
}

Результат выполнения:

Имя: Алексей
Возраст: 30
Студент? нет
Хобби: чтение программирование велосипед

Пример 2: Обработка вложенных объектов

JSON часто содержит вложенные структуры. Рассмотрим пример с адресом:

{
  "user": {
    "name": "Мария",
    "address": {
      "city": "Москва",
      "street": "Тверская"
    }
  }
}

Доступ к вложенным данным:

json nested = json::parse(json_str);
std::string city = nested["user"]["address"]["city"];
std::cout << "Город: " << city << std::endl; // Москва

Сериализация JSON в C++: создание данных

Сериализация — обратный процесс: вы создаете объект JSON в коде и преобразуете его в строку.

Пример 3: Создание простого JSON-объекта

int main() {
    json obj;

    // Заполняем объект
    obj["name"] = "Иван";
    obj["age"] = 25;
    obj["is_employed"] = true;
    obj["skills"] = {"C++", "Python", "SQL"};

    // Вложенный объект
    obj["address"]["city"] = "Санкт-Петербург";
    obj["address"]["zip"] = 190000;

    // Сериализация в строку (с отступами для читаемости)
    std::string serialized = obj.dump(4);
    std::cout << serialized << std::endl;

    return 0;
}

Результат:

{
    "address": {
        "city": "Санкт-Петербург",
        "zip": 190000
    },
    "age": 25,
    "is_employed": true,
    "name": "Иван",
    "skills": [
        "C++",
        "Python",
        "SQL"
    ]
}

Метод dump() может принимать аргумент — количество пробелов для отступа (0 — без пробелов, 4 — для красивого вывода).

Работа с файлами JSON

На практике JSON обычно хранится в файлах. Вот как читать и записывать JSON-файлы в C++.

Чтение JSON из файла

#include <fstream>

int main() {                

Блоги

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