JSON for Modern C++ — когда работа с JSON становится удовольствием

Работа с JSON в C++ раньше напоминала попытку открыть консервную банку голыми руками — приходилось либо писать парсеры самостоятельно, либо использовать громоздкие библиотеки. Проект nlohmann/json кардинально меняет эту ситуацию.
Почему стоит обратить внимание
Библиотека JSON for Modern C++ — это:
- Один заголовочный файл — просто скопируйте
json.hppв проект - Интуитивный синтаксис как в Python или JavaScript
- Поддержка C++11 и выше без внешних зависимостей
- Быстрая интеграция с STL-контейнерами
- Поддержка бинарных форматов: CBOR, MessagePack, BSON
// Пример создания JSON-объекта
json j = {
{"pi", 3.141},
{"happy", true},
{"name", "Niels"},
{"nothing", nullptr},
{"answer", {
{"everything", 42}
}},
{"list", {1, 0, 2}},
{"object", {
{"currency", "USD"},
{"value", 42.99}
}}
};
Ключевые возможности
1. Простота использования
Библиотека предлагает синтаксис, который делает работу с JSON естественной:
// Доступ к полям
std::string name = j["name"];
double pi = j["pi"];
// Модификация
j["new_field"] = "some value";
j["list"].push_back(3);
// Преобразование в строку
std::string s = j.dump(); // {"happy":true,"pi":3.141}
std::cout << j.dump(4); // Красивое форматирование
2. Интеграция с STL
Автоматическое преобразование между JSON и STL-контейнерами:
std::vector<int> v {1, 2, 3, 4};
json j_vec(v); // [1, 2, 3, 4]
std::map<std::string, int> m {{"one", 1}, {"two", 2}};
json j_map(m); // {"one": 1, "two": 2}
3. Поддержка пользовательских типов
Легкая сериализация своих классов:
struct person {
std::string name;
std::string address;
int age;
};
// Объявляем преобразования
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(person, name, address, age);
person p {"Ned Flanders", "744 Evergreen Terrace", 60};
json j = p; // Автоматическая сериализация
4. JSON Pointer и JSON Patch
// JSON Pointer
json j_original = R"({"baz": ["one", "two", "three"], "foo": "bar"})"_json;
j_original["/baz/1"_json_pointer]; // "two"
// JSON Patch
json j_patch = R"([
{ "op": "replace", "path": "/baz", "value": "boo" },
{ "op": "add", "path": "/hello", "value": ["world"] },
{ "op": "remove", "path": "/foo"}
])"_json;
json j_result = j_original.patch(j_patch);
Производительность и надежность
Библиотека активно тестируется:
- 100% покрытие тестами
- Интеграция с AddressSanitizer и Valgrind
- Постоянное фаззинг-тестирование через OSS-Fuzz
- Поддержка всех основных компиляторов (GCC, Clang, MSVC)
Когда стоит использовать
- Веб-разработка: обработка API-запросов
- Конфигурации: удобное хранение настроек
- Логирование: структурированные логи
- Сериализация данных: обмен между компонентами
// Пример чтения конфигурации
std::ifstream config_file("config.json");
json config = json::parse(config_file);
std::string host = config["database"]["host"];
int port = config["database"]["port"];
Альтернативы
Хотя существуют другие библиотеки для работы с JSON в C++ (RapidJSON, jsoncpp), nlohmann/json выделяется:
- Более чистый и современный API
- Лучшая интеграция с C++11+
- Активное сообщество и поддержка
Если вам нужна простая, но мощная библиотека для работы с JSON в C++, nlohmann/json — отличный выбор. Она особенно хороша для:
- Проектов на modern C++
- Быстрого прототипирования
- Систем, где важна читаемость кода
Библиотека доступна под лицензией MIT и активно развивается — на момент написания у проекта почти 40 000 звезд на GitHub и более 300 контрибьюторов.
Ссылки:
