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

26 июл 2025
50,487
7,480
750
2 недели

JSON for Modern C++

Работа с 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 контрибьюторов.

Ссылки:

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.