JSON обработка в C++: библиотеки, парсинг и примеры
JSON (JavaScript Object Notation) — один из самых популярных форматов обмена данными. Несмотря на то, что C++ не имеет встроенной поддержки JSON, существует несколько мощных библиотек, которые позволяют легко парсить, генерировать и модифицировать JSON-данные. В этой статье мы рассмотрим три основные библиотеки: nlohmann/json, RapidJSON и Boost.PropertyTree, а также приведём практические примеры их использования.
Зачем нужна библиотека для JSON в C++?
C++ — компилируемый язык, ориентированный на производительность. Ручной разбор JSON с помощью регулярных выражений или строковых операций — трудоёмкая и подверженная ошибкам задача. Специализированные библиотеки предоставляют:
- Высокую скорость парсинга и сериализации.
- Интуитивно понятный API (часто в стиле STL).
- Поддержку стандартов JSON (включая вложенные объекты, массивы, null, Unicode).
- Минимальное количество зависимостей (часто header-only).
1. Библиотека nlohmann/json (JSON for Modern C++)
Самая популярная и простая в использовании библиотека. Распространяется как header-only (один заголовочный файл). Идеально подходит для образовательных проектов и небольших приложений.
Установка
Скачайте файл json.hpp из репозитория nlohmann/json и подключите его:
#include "json.hpp"
using json = nlohmann::json;
Пример: парсинг JSON из строки
#include <iostream>
#include "json.hpp"
int main() {
std::string json_str = R"({
"name": "PythonLib",
"year": 2025,
"tags": ["C++", "JSON", "education"],
"active": true
})";
json data = json::parse(json_str);
std::cout << "Name: " << data["name"] << "\n";
std::cout << "Year: " << data["year"] << "\n";
std::cout << "First tag: " << data["tags"][0] << "\n";
std::cout << "Active: " << data["active"] << "\n";
return 0;
}
Пример: создание и сериализация JSON
#include <iostream>
#include "json.hpp"
int main() {
json obj;
obj["title"] = "JSON in C++";
obj["pages"] = 42;
obj["chapters"] = {"intro", "basics", "advanced"};
obj["metadata"]["author"] = "PythonLib Team";
std::string serialized = obj.dump(4); // 4 — отступ для красивого вывода
std::cout << serialized << "\n";
return 0;
}
2. Библиотека RapidJSON
RapidJSON — это высокопроизводительная библиотека, ориентированная на скорость и минимальное потребление памяти. Часто используется в играх, серверных приложениях и embedded-системах. Поддерживает SAX-стиль (потоковый разбор) и DOM-стиль.
Установка
Скачайте архив с GitHub и подключите заголовочные файлы:
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
Пример: парсинг и чтение
#include <iostream>
#include "rapidjson/document.h"
int main() {
const char* json = "{\"project\":\"PythonLib\",\"version\":2.0}";
rapidjson::Document doc;
doc.Parse(json);
if (doc.HasParseError()) {
std::cerr << "Parse error!\n";
return 1;
}
std::cout << "Project: " << doc["project"].GetString() << "\n";
std::cout << "Version: " << doc["version"].GetDouble() << "\n";
return 0;
}
Пример: генерация JSON
#include <iostream>
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
int main() {
rapidjson::Document doc;
doc.SetObject();
rapidjson::Value name;
name.SetString("PythonLib", doc.GetAllocator());
doc.AddMember("name", name, doc.GetAllocator());
rapidjson::Value tags(rapidjson