Введение: Зачем нужен 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() {