logo
GeekFormat

JSON в C++

Бесплатный онлайн инструмент JSON в C++. Вставьте JSON и автоматически генерируйте готовые к компиляции C++ struct / class коды заголовочных файлов, подходит для десериализации API ответов с помощью nlohmann/json или rapidjson, вложенные объекты автоматически разделяются на независимые классы, std::vector и std::optional обрабатываются автоматически, полностью локальная работа в браузере.

Похожие

О JSON в C++: преобразование данных JSON в компилируемые структуры C++

JSON в C++ — это процесс преобразования данных в формате JSON (объектов или массивов) в определения типов C++ struct / class. C++ — это язык программирования со строгой системой типов, широко используемый в бэкенд-сервисах, игровых движках, встраиваемых прошивках, квантовой торговле, высокопроизводительных сервисах и настольных клиентах. В разработке часто требуется преобразовывать примеры JSON из документации API или реальных ответов в типы C++, написание struct вручную не только связано с повторяющейся работой, но и легко приводит к ошибкам в типах полей, цель этого инструмента — автоматизировать этот процесс. В отличие от Java, Python, JavaScript, C++ не имеет встроенной поддержки таких динамических структур, как JSON, поэтому «JSON в C++» долгое время считался повторяющейся, но необходимой работой в инженерной среде.

Этот инструмент работает локально в браузере на основе quicktype-core, использует CPP renderer и опции рендеринга just-types для генерации кода структур на основе std::string / std::vector<T> / std::optional<T> для C++. Сгенерированный код является стандартным C++ кодом header-only, не зависит от сторонних библиотек парсинга JSON, может быть напрямую включен в любой проект C++17 / C++20. При использовании с парсерами nlohmann/json или rapidjson можно быстро завершить десериализацию ответов API. Весь процесс рендеринга выполняется асинхронно в браузере через Web Worker, основной поток остается плавным.

Вывод типов — это ядро преобразования JSON в C++. Инструмент сопоставляет базовые типы JSON со стандартными типами C++: строки с std::string, целые числа с int64_t (совместим с long long, избегая различий в размере long на разных платформах), числа с плавающей точкой с double, булевы значения с bool, массивы с std::vector<T>, вложенные объекты с независимыми struct / class, значения null с std::optional<T>. Для вложенных объектов инструмент автоматически создает новый class для каждого уровня и именует его в PascalCase, например, поле address генерирует структуру Address, объекты в массиве items генерируют структуру Item.

В отличие от некоторых онлайн-инструментов, которые требуют загрузки JSON на сервер, все вычисления этого инструмента выполняются в браузере. quicktype-core загружается и выполняется через Web Worker, парсинг JSON, вывод типов, генерация C++ кода, загрузка файлов выполняются локально, данные не отправляются на серверы. Это особенно важно для JSON, содержащего API ключи, поля с конфиденциальностью пользователей или неопубликованные бизнес-структуры, после закрытия страницы данные немедленно удаляются из памяти.

Сгенерированный код обычно используется с парсером JSON. Существует два основных варианта: ① nlohmann::json (рекомендуется, однозаголовочное включение, дружественный интерфейс сериализации шаблонов, синтаксис похож на nlohmann::json j = nlohmann::json::parse(str); User u = j.get<User>();); ② rapidjson (высокопроизводительный парсинг в стиле SAX / DOM, подходит для предельных сценариев, таких как финансы, игры, требует ручного извлечения полей через GetObject). Для встраиваемых систем также можно использовать ArduinoJson или cJSON. Код этого инструмента совместим со всеми основными библиотеками C++ JSON.

Следует отметить, что автоматически сгенерированный код — это отправная точка, а не конечный результат. Инструмент выводит типы по образцу JSON и не может определить точные бизнес-типы (например, семантические типы, такие как URL, Email, ID, все будут унифицированно выведены как std::string). Для полей JSON в snake_case поля C++ struct генерируются как есть, вам может потребоваться вручную добавить NLOHMANN_DEFINE_TYPE_INTRUSIVE или NLOHMANN_JSON_FROM / NLOHMANN_JSON_TO для объявления сопоставлений. Рекомендуется использовать сгенерированный результат как первый вариант, а затем тонко настроить имена полей, типы и аннотации сериализации в соответствии со спецификациями проекта.

В сценариях межкомандного взаимодействия JSON в C++ также является мостом для унификации моделей данных. Фронтенд использует JSON в TypeScript, бэкенд использует JSON в Java / Go / Rust, встраиваемые системы и сервисы производительности используют JSON в C++, четыре стороны используют один и тот же образец JSON для генерации своих определений типов, что может максимально гарантировать согласованность полей. Этот инструмент является «стороной C++» в этом рабочем процессе.

Одним предложением: если ваш код работает в чувствительных к производительности, строго типизированных проектах C++ с богатой экосистемой и вам нужно быстро подключить такие динамические данные, как JSON, к миру строгих типов, этот инструмент — это прямой вход для компиляции образцов JSON в структуры C++.

Варианты использования

  • Интеграция REST API: преобразование JSON ответов от бэкенда в C++ struct, сильная типизация десериализации HTTP-запросов с nlohmann::json / cpr
  • Определение интерфейсов микросервисов: преобразование примеров JSON тела запросов gRPC / HTTP сервисов в типы C++, унификация определений моделей на стороне сервера
  • Встраиваемые системы и IoT: преобразование данных сенсоров JSON, отправляемых устройствами, в C++ struct, парсинг MQTT / HTTP сообщений с ArduinoJson или ESP-IDF JSON Parser
  • Разработка игр: преобразование JSON конфигураций уровней, атрибутов персонажей в C++ struct, удобство чтения файлов данных .json движками, такими как Unreal Engine или Cocos2d-x
  • Высокочастотная финансовая торговля: преобразование JSON ответов интерфейсов бирж в C++ struct, наносекундный парсинг с rapidjson
  • Клиенты C++ Qt: преобразование серверных JSON конфигураций в C++ struct, загрузка данных GUI с QJsonObject / QJsonDocument
  • Boost.JSON / Boost.Beast: преобразование JSON ответов HTTP сервисов в C++ struct, десериализация с Boost.JSON, написание веб-бэкендов
  • Встраиваемые RTOS: преобразование JSON конфигураций систем FreeRTOS / Zephyr в C++ struct, чтение параметров прошивки с cJSON
  • Алгоритмы / квантовая торговля: преобразование JSON конфигураций систем бэктестинга в C++ struct, удобство управления конфигурациями A/B экспериментов и отслеживания версий
  • Миграция баз данных: преобразование JSON документов, экспортированных из MongoDB / PostgreSQL, в модели C++ в качестве эталона для полей сущностей
  • Аудио/видео / мультимедиа: преобразование JSON конфигураций FFmpeg / GStreamer в C++ struct, удобство чтения параметров медиапайплайнов
  • Симуляция и моделирование: преобразование входных JSON конфигураций систем симуляции в C++ struct, унификация форматов входных данных различных подмоделей
  • Создание тестовых данных: преобразование реальных JSON фикстур, возвращаемых бэкендом, в типы C++, структурированные утверждения в модульных тестах
  • Структурированный парсинг журналов: преобразование JSON журналов, собранных ELK / Loki, в типы C++, удобство создания правил фильтрации и оповещений
  • Миграция центров конфигурации: преобразование JSON конфигураций Apollo / Nacos / Consul в типы C++ для горячей загрузки серверных конфигураций
  • Межъязыковое взаимодействие: совместная отладка бэкенда C++ с фронтендом TypeScript / Java, одно и то же JSON преобразуется в C++ struct и TS interface / Java POJO
  • Обучение и тренинги: преобразование примеров JSON в struct в курсах C++, демонстрация процесса десериализации nlohmann::json
  • Преобразование имен полей: после преобразования JSON ответов API в структуры C++ вручную добавьте NLOHMANN_DEFINE_TYPE_INTRUSIVE для сопоставления полей

Как использовать

  1. Вставьте содержимое JSON в левый редактор (рекомендуется объект JSON) или нажмите кнопку загрузки, чтобы выбрать файл .json / .txt
  2. Инструмент использует quicktype-core для автоматического преобразования через Web Worker в течение 400 мс, справа отображается код заголовочного файла C++ с std::string / std::vector<T> / вложенными class
  3. Если формат JSON неверен, отображается красное сообщение, нажмите кнопку «Исправить JSON» для автоматического исправления распространенных проблем
  4. Проверьте, соответствуют ли сгенерированные имена struct / class, типы полей ожиданиям; при необходимости измените имена ключей исходного JSON и преобразуйте снова
  5. Нажмите «Копировать», чтобы вставить код в файл .h / .hpp в IDE, десериализуйте реальные ответы API; или нажмите «Скачать», чтобы сохранить как model.h / model.hpp

Функции

  • Локальное преобразование в браузере: парсинг JSON и генерация C++ кода полностью выполняются в браузере через Web Worker + quicktype-core, исходные данные не загружаются на серверы
  • Вывод в стиле nlohmann::json: автоматическая генерация STL-типов структур, таких как std::string / std::vector<T> / double / int64_t / bool, близких к стилю десериализации nlohmann::json, можно напрямую include <nlohmann/json.hpp> для парсинга
  • Совместимость с rapidjson: сгенерированные чистые C++ struct не зависят от сторонних библиотек, могут использоваться с rapidjson Document / GenericValue для высокопроизводительных сценариев парсинга
  • Автоматический вывод типов: строки JSON сопоставляются с std::string, целые числа с int64_t / long long, числа с плавающей точкой с double, булевы значения с bool, массивы с std::vector<T>, вложенные объекты с независимыми class / struct
  • Автоматическое разделение вложенных объектов: вложенный JSON автоматически генерирует независимые class / struct (в нотации PascalCase), избегая повторного определения одного и того же типа
  • Автоматическая обработка std::vector и std::optional: массивы JSON преобразуются в std::vector<T>, поля, которые могут быть null, преобразуются в std::optional<T>, соответствует практике современного C++17 / C++20
  • Автоматическое преобразование с задержкой 400 мс: после вставки JSON автоматически запускается преобразование, справа в реальном времени отображается предварительный просмотр кода заголовочного файла C++, сокращая ожидание и лишние клики
  • Исправление ошибок JSON в один клик: автоматическое исправление распространенных ошибок форматирования, таких как завершающие запятые, одинарные кавычки, отсутствующие кавычки, после успешного исправления продолжается генерация кода
  • Подсветка синтаксиса + копирование в один клик: справа CodeMirror отображает подсветку синтаксиса C++, копирование всего заголовочного файла в один клик или загрузка как файл .h / .hpp для непосредственного размещения в проекте
  • История ввода localStorage + адаптивные колонки: автоматическое сохранение последнего ввода, быстрое восстановление после обновления или случайного закрытия страницы; слева вставка JSON, справа просмотр кода C++, поддержка перетаскивания для настройки ширины панелей, адаптация для больших экранов и мобильных устройств
  • Продукт header-only без зависимостей: сгенерированные .h / .hpp имеют форму header-only, могут быть включены в любой стандартный проект C++ одним файлом, не требуют дополнительной конфигурации сборки для использования с nlohmann::json / rapidjson / Boost.JSON
  • Встроенное преобразование snake_case в camelCase: может автоматически преобразовывать поля snake_case из JSON в имена полей camelCase, рекомендуемые для C++, сохраняя отображение сериализации snake_case с NLOHMANN_DEFINE_TYPE_INTRUSIVE

Примеры кода

C++: десериализация struct, сгенерированных этим инструментом, с помощью nlohmann/json

cpp

Поместите сгенерированную структуру User в .hpp и выполните десериализацию с nlohmann::json (рекомендуется для современных проектов C++17/20).

// model.hpp(由本工具生成)
// #pragma once
// #include <cstdint>
// #include <optional>
// #include <string>
// #include <vector>
// struct Address {
//   std::string city;
//   std::string zip;
// };
// struct User {
//   int64_t id;
//   std::string name;
//   std::optional<Address> address;
//   std::vector<std::string> tags;
// };

#include <nlohmann/json.hpp>
#include "model.hpp"

using nlohmann::json;

int main() {
    std::string raw = R"({
        "id": 1,
        "name": "Alice",
        "address": { "city": "Beijing", "zip": "100000" },
        "tags": ["cpp", "nlohmann"]
    })";

    // 1) 解析 JSON 字符串
    json j = json::parse(raw);

    // 2) 强类型反序列化为本工具生成的 struct
    User u = j.get<User>();

    // 3) 访问字段
    std::cout << u.name << " lives in "
              << (u.address ? u.address->city : "unknown")
              << std::endl;

    for (const auto& tag : u.tags) {
        std::cout << "tag: " << tag << std::endl;
    }
    return 0;
}

/*
 * 编译(CMake 项目):
 *   find_package(nlohmann_json REQUIRED)
 *   target_link_libraries(my_app PRIVATE nlohmann_json::nlohmann_json)
 * 编译(vcpkg):
 *   vcpkg install nlohmann-json
 * 单文件集成:
 *   直接下载 https://github.com/nlohmann/json/releases 的 json.hpp
 */

C++: парсинг JSON в struct с помощью rapidjson

cpp

rapidjson не поддерживает автоматическую десериализацию в пользовательские struct, требуется ручное извлечение через GetObject. Подходит для высокопроизводительных сценариев, таких как финансы / игры.

#include "rapidjson/document.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
#include "model.hpp"

int main() {
    const char* raw = R"({
        "id": 1,
        "name": "Alice",
        "address": { "city": "Beijing", "zip": "100000" },
        "tags": ["cpp", "rapidjson"]
    })";

    // 1) rapidjson DOM 解析
    rapidjson::Document doc;
    doc.Parse(raw);

    // 2) 构造本工具生成的 struct 并手动填充
    User u;
    u.id = doc["id"].GetInt64();
    u.name = doc["name"].GetString();

    if (doc.HasMember("address") && doc["address"].IsObject()) {
        Address addr;
        addr.city = doc["address"]["city"].GetString();
        addr.zip  = doc["address"]["zip"].GetString();
        u.address = addr;
    }

    for (auto& tag : doc["tags"].GetArray()) {
        u.tags.push_back(tag.GetString());
    }

    // 3) 使用填充后的 struct
    std::cout << u.name << ", tags=" << u.tags.size() << std::endl;
    return 0;
}

/*
 * rapidjson 高性能小贴士:
 *   ① 配合 rapidjson::MemoryPoolAllocator 与 StringBuffer 可进一步提速;
 *   ② 高频场景可使用 SAX 风格的 Reader / Writer 直接流式处理;
 *   ③ 启用 RAPIDJSON_SSE42 / RAPIDJSON_SIMD 宏可使用 CPU SIMD 指令加速。
 */

C++: обработка сопоставления полей snake_case с NLOHMANN_DEFINE_TYPE_INTRUSIVE

cpp

Когда поля JSON имеют формат snake_case, а члены C++ должны использовать camelCase / PascalCase, объявите сопоставление с помощью макросов nlohmann/json.

#include <nlohmann/json.hpp>
#include <string>
#include <cstdint>

// 假设本工具生成字段为 snake_case:user_name, created_at
// 实际工程中重命名为 camelCase 时添加如下宏
struct UserProfile {
    int64_t id;
    std::string userName;       // JSON 中是 "user_name"
    std::string emailAddress;   // JSON 中是 "email_address"
    std::string createdAt;      // JSON 中是 "created_at"
};

// 用 NLOHMANN_DEFINE_TYPE_INTRUSIVE 在类内部声明映射
// 注意:必须放在 public 区域
// 
// NLOHMANN_DEFINE_TYPE_INTRUSIVE(UserProfile, id, userName, emailAddress, createdAt)

// 或者用非侵入式宏(避免修改类本身):
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(UserProfile, id, userName, emailAddress, createdAt)

// 用法:
int main() {
    nlohmann::json j = {
        {"id", 1},
        {"user_name", "Alice"},
        {"email_address", "alice@example.com"},
        {"created_at", "2026-07-14T10:00:00.000Z"}
    };

    UserProfile p = j.get<UserProfile>();
    // 序列化时也会按原字段名输出
    std::cout << j.dump(2) << std::endl;
    return 0;
}

/*
 * 提示:
 *   ① 侵入式宏(NLOHMANN_DEFINE_TYPE_INTRUSIVE)必须放在 public 区域;
 *   ② 非侵入式宏(NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE)定义在类外;
 *   ③ 字段顺序要与宏参数严格一致;
 *   ④ 日期字段可改用 nlohmann::json 自定义 adl_serializer 处理 ISO 8601 格式。
 */

Best Practices

Большинство команд рекомендуют сначала использовать nlohmann::json, поскольку его API похож на STL, при десериализации достаточно одной строки j.get<User>(). Переключайтесь на rapidjson только при возникновении узких мест производительности. Структуры, сгенерированные этим инструментом, могут работать с обоими.

Репозиторий nlohmann/jsonРепозиторий rapidjson

Использование FetchContent — самый чистый способ интеграции nlohmann/json в CMake, не требует предустановки vcpkg; если не хотите настраивать FetchContent, можно использовать vcpkg или напрямую скачать json.hpp.

Документация CMake FetchContent

Инструмент по умолчанию сохраняет исходные имена полей JSON (snake_case). Если вы хотите использовать camelCase или PascalCase, добавьте NLOHMANN_DEFINE_TYPE_INTRUSIVE внутри класса для явного сопоставления, иначе десериализация завершится неудачей.

Документация NLOHMANN_DEFINE_TYPE_INTRUSIVE

В C++17+ напрямую используйте std::optional<T>; в проектах C++11/14 замените на boost::optional<T>; в проектах в стиле C используйте cJSON + поля-сентинели. Обратите внимание, что интерфейсы std::optional и boost::optional немного различаются.

cppreference std::optional

На устройствах с очень маленькой ОЗУ, таких как Arduino Uno / ESP8266, std::vector и std::string обычно вызывают OOM. Вместо этого используйте ArduinoJson 6.x + StaticJsonDocument для ограничения буфера и замените std::vector<T> на std::array<T, N> фиксированного размера.

Документация ArduinoJson

Весь парсинг, генерация кода и загрузка файлов этого инструмента полностью выполняются локально в браузере через Web Worker, исходный JSON не загружается на серверы. Но все же рекомендуется: ① сначала обезличивайте внутренние бизнес-модели; ② закрывайте страницу, чтобы очистить память; ③ в сценариях соответствия требованиям крупных компаний используйте локальный quicktype.

JSON с уровнем вложенности более 6 слоев рекомендуется реструктурировать на стороне источника, или после генерации вручную разделите глубокую вложенность на промежуточные структуры для улучшения читаемости и скорости компиляции. Глубокая вложенность может привести к чрезмерной глубине инстанцирования шаблонов.

Код, сгенерированный этим инструментом, по сути является C++ (использует функции C++, такие как std::optional / template), рекомендуется использовать суффикс .hpp для обозначения «C++ header», чтобы отличить от .h заголовков C.

Спецификация суффиксов GCCРаспознавание типов CMake

Часто задаваемые вопросы

Как преобразовать JSON в определения структур / классов C++?

Вставьте содержимое JSON в левый редактор (также поддерживается перетаскивание или нажатие для загрузки файлов .json / .txt), инструмент автоматически вызовет quicktype-core локально в браузере в течение 400 мс для генерации кода заголовочного файла C++; в правой области CodeMirror отображается код структуры с std::string / std::vector<T> / вложенными class. Если формат JSON неверен, нажмите кнопку «Исправить JSON» для автоматического исправления перед преобразованием.

Какие заголовочные файлы нужно включить для сгенерированного C++ кода?

Инструмент выводит код структур header-only, зависящий только от стандартной библиотеки C++ (<string>, <vector>, <optional>, <cstdint>). При парсинге с nlohmann/json дополнительно требуется #include <nlohmann/json.hpp>; при парсинге с rapidjson требуется #include "rapidjson/document.h". Остальные стандартные заголовки инструмент объявляет по мере необходимости.

Какие структуры данных JSON поддерживаются?

Поддерживаются все допустимые структуры JSON: базовые типы (null, boolean, number, string), массивы (одномерные или многомерные), вложенные объекты (любой глубины). Объекты JSON генерируют корневой struct / class, массивы JSON появляются как std::vector<T> в некотором поле верхней структуры. Не поддерживаются специфичные для JavaScript значения, такие как литералы объектов, функции, Symbol, undefined и т. д.

Как типы полей JSON сопоставляются с типами C++?

Строки сопоставляются с std::string; целые числа с int64_t (также часто long long для совместимости со старым кодом); числа с плавающей точкой с double; булевы значения с bool; массивы с std::vector<T>; вложенные объекты с независимыми struct / class; значения null с std::optional<T> (может использоваться nlohmann::json в качестве резервного варианта). Подробные правила сопоставления см. в «Таблице быстрого сопоставления типов JSON с типами C++» внизу страницы.

Какой тип генерируется для значений null?

Значения null в JSON генерируют std::optional<T> (доступно с C++17), указывая, что поле может отсутствовать или иметь неопределенный тип. Если вы уже знаете фактический тип поля, вы можете указать пример значения в исходном JSON (например, "field": "" выводится как std::string), а после генерации изменить на более точный тип, такой как std::optional<std::string>, в соответствии с бизнес-требованиями.

Преобразуются ли массивы автоматически в std::vector?

Да. Массивы JSON унифицированно преобразуются в контейнеры шаблонов C++ std::vector<T>, тип элемента автоматически выводится по первому элементу массива. Например, ["a","b"] генерирует std::vector<std::string>, [1,2,3] генерирует std::vector<int64_t>, [{...},{...}] генерирует std::vector<Item> (Item - независимая struct, сгенерированная по вложенному объекту).

Как обрабатываются вложенные объекты?

Каждый вложенный объект генерирует независимый struct / class, правила именования - PascalCase по имени поля (например, поле address генерирует структуру Address, объекты в массиве items генерируют структуру Item). Корневая структура ссылается на вложенные классы через члены типа std::optional<Address> или Address. Объекты с одинаковой структурой повторно используют один и тот же тип, избегая повторных определений.

Можно ли использовать сгенерированный код для десериализации с nlohmann/json?

Да. Пример типичного использования: nlohmann::json j; j["root"] = nlohmann::json::parse(raw_json); User u = j.get<User>(); при условии, что в проект включена однозаголовочная зависимость nlohmann/json (непосредственно include <nlohmann/json.hpp>) и определена сгенерированная этим инструментом структура User.

Можно ли использовать сгенерированный код для десериализации с rapidjson?

Да. rapidjson требует ручного написания кода извлечения полей типа GetObject. Типичный путь: rapidjson::Document doc; doc.Parse(raw_json); const auto& obj = doc["root"]; std::string id = obj["id"].GetString(); поскольку rapidjson не поддерживает автоматическую десериализацию через шаблоны, сгенерированные struct служат только эталоном модели данных.

Как обрабатываются поля JSON в snake_case?

Инструмент генерирует поля C++ с сохранением исходных имен полей JSON (например, user_name). Если вы хотите, чтобы члены C++ использовали camelCase (userName) или PascalCase (UserName), вы можете вручную изменить их после генерации и добавить макросы NLOHMANN (NLOHMANN_DEFINE_TYPE_INTRUSIVE / NLOHMANN_JSON_FROM / NLOHMANN_JSON_TO) для указания сопоставления.

Можно ли напрямую поместить сгенерированный заголовочный файл в проекты Qt / Unreal / Boost?

Да. Код, сгенерированный этим инструментом, является стандартным C++ кодом header-only, не зависит от конкретных фреймворков. При парсинге с Qt QJsonObject используйте структуры как модели данных (члены помечены Q_GADGET); при использовании с Unreal Engine используйте с FJsonObjectConverter::JsonObjectStringToUStruct; при использовании с Boost.JSON парсите JSON в boost::json::object и извлекайте поля по одному.

Загружаются ли данные на сервер? Безопасна ли конфиденциальность?

Полностью локальная работа в браузере. Весь парсинг JSON, генерация C++ кода и загрузка файлов полностью выполняются в браузере через JavaScript (Web Worker + quicktype-core), введенные данные JSON и сгенерированный C++ код не загружаются на какие-либо серверы, не записываются и не кэшируются в облако. Чувствительный JSON, содержащий API ключи, токены, неопубликованные бизнес-поля, можно безопасно использовать, после закрытия страницы данные очищаются.

Требуется ли регистрация или вход?

Не требуется. Инструмент полностью бесплатный, не требует регистрации, входа или авторизации. Можно использовать сразу после открытия страницы, все функции доступны локально в браузере, без каких-либо ограничений на количество вызовов или размер файлов (в пределах памяти браузера).

Что делать, если формат JSON неверен?

Инструмент автоматически проверяет допустимость JSON, при ошибке справа отображается красное сообщение об ошибке и предоставляется кнопка «Исправить JSON». После нажатия автоматически исправляются распространенные ошибки: лишние запятые в конце, замена одинарных кавычек на двойные, дополнение кавычек для ключей без кавычек, удаление комментариев и т. д. После успешного исправления продолжается генерация C++ кода.

В чем разница между этим инструментом и JSON в Java / JSON в Rust?

Все три преобразуют JSON в определения типов целевого языка, но выходные формы различаются: JSON в C++ генерирует header-only struct / class, вам нужно дополнительно написать код десериализации с nlohmann/json или rapidjson; JSON в Java генерирует полные классы POJO с getter/setter, которые можно напрямую компилировать и запускать; JSON в Rust генерирует struct с derive Serde, которые могут напрямую десериализовываться через serde_json. Выбор зависит от вашего технологического стека.

Устранение неполадок

Отображается «Введите данные JSON» или правая сторона пуста

Левое поле ввода пусто или содержит только пробельные символы. Убедитесь, что вы вставили допустимое содержимое JSON, или нажмите кнопку загрузки, чтобы выбрать файл .json / .txt.

Отображается сбой парсинга JSON

Распространенные причины: лишние запятые в конце, использование одинарных кавычек вместо двойных, ключи без двойных кавычек, наличие комментариев JavaScript. Нажмите кнопку «Исправить JSON», чтобы автоматически исправить некоторые ошибки.

Ошибка компиляции «std::optional не объявлен»

Проект не использует стандарт C++17 или выше. std::optional введен в C++17. В CMakeLists.txt установите CMAKE_CXX_STANDARD на 17 или выше (set(CMAKE_CXX_STANDARD 17)); или добавьте #include <optional> и проверьте версию компилятора.

Ошибка компиляции «int64_t не объявлен»

Инструмент использует int64_t из <cstdint>, требуется GCC 4.5+ / Clang 3.0+ / MSVC 2015+. Проверьте, содержит ли исходный файл #include <cstdint>, и убедитесь, что стандарт C++ установлен >= C++11.

Потеря полей при десериализации nlohmann::json

Возможные причины: ① имена полей JSON не полностью совпадают с именами членов C++; ② вложенные объекты не обработаны правильно; ③ доступ value() к полю std::optional вызывает исключение. Решение: добавьте макрос NLOHMANN_DEFINE_TYPE_INTRUSIVE для явного сопоставления полей.

Ошибка сегментации GetString при парсинге rapidjson

rapidjson по умолчанию не проверяет типы полей. GetString безопасен только тогда, когда поле действительно существует и имеет строковый тип. Улучшенный синтаксис: if (doc.HasMember("name") && doc["name"].IsString()) { u.name = doc["name"].GetString(); }.

Сгенерированные типы полей недостаточно точны

Инструмент выводит типы по образцу JSON, все целые числа — int64_t, все строки — std::string. Если вам нужны более точные типы, такие как int32_t, uint64_t, std::chrono::system_clock::time_point, вручную измените типы полей после генерации.

Поле null сгенерировало std::optional<nlohmann::json> вместо std::optional<std::string>

Поскольку JSON null не может вывести конкретный тип, инструмент использует std::optional<nlohmann::json> в качестве резервного варианта. Если вы знаете фактический тип поля, вы можете указать пример значения в исходном JSON и сгенерировать снова.

Поля JSON в snake_case не соответствуют стилю именования C++

Инструмент генерирует поля C++ с сохранением исходных имен полей JSON. Если вы хотите использовать camelCase и при этом правильно десериализовывать snake_case JSON, используйте макросы NLOHMANN_DEFINE_TYPE_INTRUSIVE / NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE.

Загруженный файл .hpp вызывает ошибки компиляции

Возможные причины: ① CMake не установил стандарт C++17 / C++20; ② отсутствуют заголовочные файлы; ③ имя структуры конфликтует с другими типами. Решение: добавьте set(CMAKE_CXX_STANDARD 17), добавьте соответствующие заголовки, оберните в namespace или переименуйте структуры.

Глоссарий

struct / class
Ключевые слова в C++ для определения составных типов данных. Этот инструмент генерирует именно struct, например struct User { int64_t id; std::string name; };. В C++ struct и class почти эквивалентны (различаются права доступа по умолчанию: члены struct по умолчанию public, члены class по умолчанию private), инструмент по умолчанию генерирует struct. В сценариях десериализации использование struct более лаконично; если требуется инкапсуляция, можно вручную изменить на class.
std::string
Строковый тип стандартной библиотеки C++ (семантика владения), определенный в <string>. Этот инструмент автоматически сопоставляет строковые поля JSON с std::string, например std::string name. Обратите внимание, что std::string отличается от char* / char[] языка C: std::string автоматически управляет памятью, поддерживает перегрузку операторов (+, ==, <), но обеспечивает наилучшую производительность при обработке строк малой и средней длины.
std::vector<T>
Контейнер динамического массива стандартной библиотеки C++ (<vector>), эквивалентный ArrayList Java, list Python, Array JavaScript. Этот инструмент автоматически сопоставляет поля массивов JSON с std::vector<T>, например std::vector<std::string> tags. Преимущества: непрерывная память, случайный доступ O(1), добавление в конец O(1) амортизированное; недостатки: вставка в середину O(n).
std::optional<T>
Упаковочный тип для необязательных значений стандартной библиотеки начиная с C++17 (<optional>), указывает, что значение может отсутствовать. Типичное использование: std::optional<std::string> nickname; if (nickname) { use(*nickname); }. Этот инструмент сопоставляет поля JSON, которые могут быть null, с std::optional<T>, например std::optional<std::string> nickname. Если ваш проект должен использовать C++11/14, можно заменить на boost::optional<T>.
int64_t / double
int64_t — это псевдоним 64-битного целочисленного типа с фиксированной шириной из <cstdint>, эквивалентный long long, кроссплатформенно гарантирует 8 байт. double — это тип двойной точности с плавающей точкой C++ (IEEE 754 двойной точности, примерно 15-17 значащих цифр). Этот инструмент унифицированно сопоставляет целые числа JSON с int64_t, а числа с плавающей точкой с double, избегая проблем с точностью, вызванных несогласованным размером long на разных платформах.
nlohmann::json
Одна из самых популярных библиотек JSON в экосистеме C++, также известная как nlohmann/json, опубликована Нильсом Ломаном. Ее основная идея — сопоставление структур данных JSON с типами стандартной библиотеки C++, при десериализации можно завершить одной строкой j.get<T>(). Код, сгенерированный этим инструментом, может использоваться с nlohmann/json, используя макросы NLOHMANN_DEFINE_TYPE_INTRUSIVE для автоматической десериализации. Однозаголовочная зависимость, богатая документация, API соответствует стилю STL.
rapidjson
Высокопроизводительная библиотека JSON с открытым исходным кодом от Tencent (C++), объем кода около 5 тыс. строк, производительность примерно в 3-5 раз выше, чем у nlohmann::json. Поддерживает два стиля парсинга: SAX (потоковый) и DOM (объектная модель документа), имеет специальную реализацию ускорения для инструкций SIMD. Типичные сценарии:推送 финансовых торговых котировок, сериализация объектов игровых движков, высокопроизводительные журналы. Сгенерированные этим инструментом struct могут использоваться в качестве целевых моделей десериализации rapidjson, но требуется ручное извлечение полей.
Web Worker / quicktype-core
Web Worker — это API фонового потока, предоставляемый браузером, выполняется параллельно с основным потоком, не может получить доступ к DOM основного потока. quicktype-core — это открытая библиотека генерации кода из JSON на несколько языков (GitHub: quicktype/quicktype), поддерживает C++/Java/TypeScript/Rust/Go/Python/Swift и другие языки. Этот инструмент на основе quicktype-core локально в браузере рендерит код структур header-only для C++, исходные данные не загружаются на серверы.
snake_case / camelCase / PascalCase
Три основных стиля именования полей: snake_case (user_name, предпочтительно для C / Python / БД), camelCase (userName, предпочтительно для Java / JS), PascalCase (UserName, предпочтительно для полей C# / Rust struct). Этот инструмент по умолчанию сохраняет исходные имена полей JSON (обычно snake_case), вы можете вручную настроить их после генерации и добавить макрос NLOHMANN для объявления сопоставления.
NLOHMANN_DEFINE_TYPE_INTRUSIVE
Макрос, предоставляемый библиотекой nlohmann/json, для объявления сопоставления полей сериализации JSON внутри класса. Синтаксис: NLOHMANN_DEFINE_TYPE_INTRUSIVE(ClassName, member1, member2, ...), должен находиться в области public. Неинтрузивная версия NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE находится вне класса, не требует изменения самого класса. Структуры, сгенерированные этим инструментом, не добавляют такие макросы автоматически, добавляйте их вручную при необходимости.

Таблица быстрого сопоставления типов JSON с типами C++

Инструмент автоматически выводит соответствующие типы C++ на основе типа значений JSON:

JSON 值示例生成 C++ 类型Примечание
nullstd::optional<T>Тип null неопределен, используется std::optional<T> (C++17+)
true / falseboolБулевы значения JSON напрямую сопоставляются с C++ bool
42int64_tЦелые числа JSON по умолчанию сопоставляются с int64_t (<cstdint>), совместимы с long long
3.14doubleЧисла с плавающей точкой JSON по умолчанию сопоставляются с double (IEEE 754)
"hello"std::stringСтроки JSON сопоставляются с std::string (<string>)
["a","b"]std::vector<std::string>Массивы строк сопоставляются с std::vector<std::string>
[1,2,3]std::vector<int64_t>Массивы целых чисел сопоставляются с std::vector<int64_t>
[{...},{...}]std::vector<Item>Массивы объектов генерируют struct по первому элементу, оборачиваются в std::vector
[]std::vector<nlohmann::json>Пустые массивы не могут вывести тип, используется nlohmann::json в качестве резервного варианта
{...} 嵌套对象独立 struct / classВложенные объекты генерируют независимые struct, именование PascalCase (address → Address)

Сравнительная таблица выбора распространенных парсеров JSON C++

Сравнение основных библиотек парсинга JSON в экосистеме C++, выбирайте в соответствии с потребностями проекта:

НазваниеAPI 风格性能Сценарии
nlohmann::json模板 / STL-likeСредн.Веб-бэкенды, настольные приложения, обучение
rapidjsonSAX / DOMОчень высок.Финансы, игры, высокопроизводительные сервисы; SIMD
Boost.JSONBoost.ContainerВысок.Экосистема Boost, веб-серверы (Beast / Asio)
cJSONC 风格 / 函数式Высок.Проекты на C, встраиваемые C++
ArduinoJsonC++ 模板Средн.Arduino, ESP32 / ESP8266, встраиваемые MCU

Таблица соответствия типов стандартной библиотеки C++ и JSON

Обзор основных типов стандартной библиотеки C++, соответствующих полям JSON:

Ключевое слово JSONТип C++ЗаголовокСтандарт C++
stringstd::string<string>C++98
integerint64_t(<cstdint>)<cstdint>C++11
numberdouble<iostream> / <cmath>C++98
booleanbool<stdbool.h>(C) / 内置C++98
nullstd::optional<T><optional>C++17
arraystd::vector<T><vector>C++98
array 固定std::array<T, N><array>C++11
object / mapstd::map<std::string, T><map>C++98
object 哈希std::unordered_map<K, T><unordered_map>C++11
string viewstd::string_view(不拥有数据)<string_view>C++17
byte / charstd::byte / char<cstddef>C++17 / C++98

Privacy & Security

Все операции этого инструмента JSON в C++ полностью выполняются локально в вашем браузере: парсинг JSON, генерация структур C++, загрузка файлов — все выполняется на клиенте через JavaScript браузера (Web Worker + quicktype-core), содержимое JSON, загруженные файлы или сгенерированный код не отправляются по сети на какие-либо серверы. Загрузка файлов использует собственный API FileReader браузера для прямого чтения в память. Не использует отслеживание Cookie, не собирает никакие данные ввода или использования пользователя. После закрытия или обновления страницы все содержимое автоматически удаляется из памяти. Подходит для обработки JSON, содержащего ключи API, токены, конфиденциальные бизнес-данные.

Authoritative References