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

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

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

Начать курс

Введение в работу с JSON в C++

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

1. Установка и подключение библиотеки nlohmann/json

Библиотека nlohmann/json — это одна из самых популярных и простых в использовании библиотек для работы с JSON в C++. Она поддерживает C++11 и выше, а также работает на всех основных платформах.

Способы установки

  • Скачать заголовочный файл: перейдите на GitHub-репозиторий и скачайте файл json.hpp.
  • Установка через vcpkg: vcpkg install nlohmann-json
  • Установка через Conan: conan install nlohmann_json/3.11.2@

После установки просто подключите файл в вашем проекте:

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

int main() {
    std::cout << "Библиотека подключена!" << std::endl;
    return 0;
}

2. Парсинг JSON: чтение данных из строки и файла

Парсинг (разбор) JSON — это процесс преобразования строки в формате JSON в структуры данных C++. Библиотека nlohmann/json делает это очень просто.

Парсинг из строки

Рассмотрим пример разбора простого JSON-объекта:

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

int main() {
    std::string json_str = R"({
        "name": "Анна",
        "age": 25,
        "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;
}

Парсинг из файла

Часто JSON-данные хранятся в файлах. Вот как их прочитать:

#include <iostream>
#include <fstream>
#include "json.hpp"
using json = nlohmann::json;

int main() {
    std::ifstream file("data.json");
    if (!file.is_open()) {
        std::cerr << "Ошибка открытия файла!" << std::endl;
        return 1;
    }

    json data = json::parse(file);
    file.close();

    // Вывод данных
    std::cout << "Данные из файла: " << data.dump(4) << std::endl;
    return 0;
}

Метод dump(4) преобразует JSON обратно в строку с отступами в 4 пробела для удобного чтения.

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

Сериализация — это обратный процесс: преобразование данных C++ в строку JSON. Библиотека позволяет создавать JSON-объекты интуитивно понятным способом.

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

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

int main() {
    json person;

    person["name"] = "Иван";
    person["age"] = 30;
    person["is_employed"] = true;
    person["salary"] = 75000.50;

    // Вложенный объект
    person["address"]["city"] = "Москва";
    person["address"]["street"] = "Тверская";
    person["address"]["zip"] = "101000";

    // Массив
    person["skills"] = {"C++", "Python", "SQL"};

    // Вывод в строку
    std::string json_string = person.dump(2);
    std::cout << json_string << std::endl;

    // Сохранение в файл
    std::ofstream out_file("output.json");
    out_file << person.dump(4);
    out_file.close();

    return 0;
}

Сериализация вложенных структур

Вы можете создавать сложные иерархические структуры данных:

json employees = json::array();

json emp1;
emp1["id"] = 1;
emp1["name"] = "Ольга";
emp1["department"] = "Разработка";

json emp2;
emp2["id"] = 2;
emp2["name"] = "Петр";
emp2["department"] = "Тестирование";

employees.push_back(emp1);
employees.push_back(emp2);

json company;
company["name"] = "ТехноКорп";
company["employees"] = employees;
company["founded"] = 2010;

std::cout << company.dump(2) << std::endl;

4. Практические советы и обработка ошибок

При работе с JSON важно корректно обрабатывать возможные ошибки. Вот несколько рекомендаций:

Проверка наличия ключей

Используйте метод contains() или find():

if (data.contains("email")) {
    std::string email = data["email"];
    std::cout << "Email: " << email << std::endl;
} else {
    std::cout << "Поле email отсутствует" << std                

Блоги

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