logo
GeekFormat

JSON 转 C++

免费在线 JSON 转 C++ 工具。粘贴 JSON 自动生成可直接编译的 C++ struct / class 头文件代码,适合用 nlohmann/json 或 rapidjson 反序列化 API 响应,嵌套对象自动拆分为独立类,std::vector 与 std::optional 自动处理,纯浏览器本地运行。

相关推荐

关于 JSON 转 C++:把 JSON 数据变成可编译的 C++ 结构体

JSON 转 C++ 是把 JSON 格式的数据(对象或数组)转换为 C++ struct / class 类型定义的过程。C++ 是一门强类型系统编程语言,广泛用于后端服务、游戏引擎、嵌入式固件、量化交易、高性能服务和桌面客户端等场景。开发中经常需要把 API 文档或实际响应中的 JSON 样本转成 C++ 类型,手写 struct 不仅重复劳动多,还容易把字段类型写错,本工具的目标就是把这一过程自动化。C++ 与 Java、Python、JavaScript 不同,缺少对 JSON 这种动态结构的原生支持,所以 'JSON 转 C++' 在工程界长期被视为'重复但不可省略'的工作。

本工具基于 quicktype-core 在浏览器本地运行,使用 CPP renderer 和 just-types 渲染选项,为 C++ 生成基于 std::string / std::vector<T> / std::optional<T> 的结构体代码。生成的是 header-only 标准 C++ 代码,不依赖任何第三方 JSON 解析库,可直接 #include 进任意 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 嵌套层级只会生成一次,不会重复定义。

与一些需要把 JSON 上传到服务器处理的在线工具不同,本工具的所有计算都在浏览器内完成。quicktype-core 通过 Web Worker 加载和执行,JSON 解析、类型推断、C++ 代码生成、文件下载都在本地进行,不向任何服务器发送数据。这对于包含 API key、用户隐私字段或未上线业务结构的 JSON 尤其重要,关闭页面后数据即从内存中清除。无论公司网络环境、内部审计要求、还是离线开发场景,本工具都能提供与 quicktype 命令行工具同等的可信度。

生成后的代码通常需要配合 JSON 解析器使用。主流选择有两种:① nlohmann::json(推荐,单 header 引入,模板序列化接口友好,写法类似 nlohmann::json j = nlohmann::json::parse(str); User u = j.get<User>(););② rapidjson(高性能 SAX / DOM 风格解析,适合金融、游戏等极限场景,需要手动 GetObject 提取字段)。对于嵌入式,还可以用 ArduinoJson(资源受限)或 cJSON(C 风格接口)。本工具的代码与所有主流 C++ JSON 库兼容,不强制绑定某个生态。

需要注意的是,自动生成的代码是起点而不是终点。工具按 JSON 样本推断类型,无法判断业务上的精确类型(例如 URL、Email、ID 等语义类型都会被统一推断为 std::string)。对于 snake_case 的 JSON 字段,C++ struct 字段会保持原样生成,你可能需要手动添加 NLOHMANN_DEFINE_TYPE_INTRUSIVE 或 NLOHMANN_JSON_FROM / NLOHMANN_JSON_TO 来声明映射关系。建议把生成结果作为初稿,再根据项目规范微调字段名、类型和序列化注解。这种'AI 写初稿 + 工程师审稿'的工作流也是大量 C++ 团队的实际节奏。

在跨团队协作场景下,JSON 转 C++ 也是统一数据模型的桥梁。前端用 JSON 转 TypeScript、后端用 JSON 转 Java / Go / Rust、嵌入式与性能服务用 JSON 转 C++,四端用同一份 JSON 样本生成各自的类型定义,能最大限度保证字段一致性。本工具是这个工作流里的'C++ 端',与站内其他 JSON 转 TypeScript / Java / Rust / Go / Python 工具可同时使用。

一句话总结:如果你的代码运行在性能敏感、强类型、生态丰富的 C++ 项目里,又需要把 JSON 这类动态数据快速接入强类型世界,本工具就是直接把 JSON 样本编译成 C++ 结构体的快捷入口。

适用场景

  • REST API 联调:把后端返回的 JSON 响应转成 C++ struct,配合 nlohmann::json / cpr 做强类型 HTTP 请求反序列化
  • 微服务接口定义:把 gRPC / HTTP 服务的请求体示例 JSON 转成 C++ 类型,统一服务端模型定义
  • 嵌入式与 IoT:把设备上报的 JSON 传感器数据转成 C++ struct,配合 ArduinoJson 或 ESP-IDF JSON Parser 解析 MQTT / HTTP 报文
  • 游戏开发:把关卡配置、角色属性 JSON 转成 C++ struct,方便 Unreal Engine 或 Cocos2d-x 等引擎读取 .json 数据文件
  • 金融高频交易:把交易所 JSON 接口响应(如 OKX / Binance / 雪球行情)转成 C++ struct,配合 rapidjson 做纳秒级解析
  • C++ Qt 客户端:把服务端 JSON 配置转成 C++ struct,配合 QJsonObject / QJsonDocument 做 GUI 数据加载
  • Boost.JSON / Boost.Beast:把 HTTP 服务的 JSON 响应转成 C++ struct,配合 Boost.JSON 做反序列化,编写 Web 后端
  • 嵌入式 RTOS:把 FreeRTOS / Zephyr 系统配置 JSON 转成 C++ struct,配合 cJSON 做固件参数读取
  • 算法 / 量化:把回测系统的 JSON 配置转成 C++ struct,便于 A/B 实验配置管理与版本回溯
  • 数据库迁移:把 MongoDB / PostgreSQL 导出的 JSON 文档转成 C++ 模型,作为 cpp-httplib / libpqxx 实体字段的参考
  • 音视频 / 多媒体:把 FFmpeg / GStreamer 配置 JSON 转成 C++ struct,方便媒体管线参数读取
  • 仿真与建模:把仿真系统的 JSON 输入配置转成 C++ struct,统一不同子模型的输入数据格式
  • 测试数据构造:把后端返回的真实 JSON fixture 转成 C++ 类型,在 Google Test / Catch2 单元测试中做结构化断言
  • 日志结构化解析:把 ELK / Loki 抓取的 JSON 日志转成 C++ 类型,方便做过滤和告警规则
  • 配置中心迁移:把 Apollo / Nacos / Consul 的 JSON 配置转成 C++ 类型,用于服务端配置热加载
  • 跨语言协作:后端 C++ 与前端 TypeScript / Java 联调,同一份 JSON 分别转成 C++ struct 和 TS interface / Java POJO 保持两端一致
  • 教学与培训:C++ 课程中把示例 JSON 转成 struct,演示 nlohmann::json 反序列化过程和模板元编程概念
  • 字段命名转换:把 snake_case 的 JSON API 响应转成 C++ 结构体后,手动添加 NLOHMANN_DEFINE_TYPE_INTRUSIVE 做字段映射

使用方法

  1. 在左侧编辑器粘贴 JSON 内容(推荐 JSON 对象),或点击上传按钮选择 .json / .txt 文件
  2. 工具使用 quicktype-core 通过 Web Worker 在 400ms 内自动转换,右侧显示带 std::string / std::vector<T> / 嵌套 class 的 C++ 头文件代码
  3. 如 JSON 格式错误会显示红色提示,点击「修复 JSON」按钮自动修复尾随逗号、单引号等常见问题后重试
  4. 检查生成的 struct / class 名称、字段类型是否符合预期;如需调整可修改源 JSON 的 key 名再重新转换
  5. 点击「复制」将代码粘贴到 IDE 的 .h / .hpp 文件中,配合 nlohmann/json 或 rapidjson 反序列化真实 API 响应;或点击「下载」保存为 model.h / model.hpp

功能特点

  • 本地浏览器转换:JSON 解析与 C++ 代码生成全部在浏览器内通过 Web Worker + quicktype-core 完成,原始数据不上传任何服务器
  • nlohmann::json 风格输出:自动生成 std::string / std::vector<T> / double / int64_t / bool 等 STL 类型结构体,贴近 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 实践
  • 400ms 防抖自动转换:粘贴 JSON 后自动触发转换,右侧实时预览 C++ 头文件代码,减少等待和多余点击
  • JSON 错误一键修复:自动修复尾随逗号、单引号、缺引号等常见格式错误,修复成功后继续生成代码
  • 代码高亮 + 一键复制:右侧 CodeMirror 渲染 C++ 语法高亮,一键复制整个头文件,或下载为 .h / .hpp 文件直接放入工程
  • localStorage 输入历史 + 响应式分栏:自动保存最近输入,刷新或误关页面后可快速恢复;左侧粘贴 JSON,右侧查看 C++ 代码,支持拖拽调整面板宽度,适配大屏和移动端
  • 零依赖 header-only 产物:生成的 .h / .hpp 是 header-only 形式,可单文件 include 进任意标准 C++ 项目,无需额外构建配置即可与 nlohmann::json / rapidjson / Boost.JSON 配合使用
  • snake_case 转 camelCase 内置:可把 JSON 中 snake_case 字段自动转为 C++ 推荐的 camelCase 字段名,配合 NLOHMANN_DEFINE_TYPE_INTRUSIVE 保持 snake_case 序列化映射

代码示例

C++:用 nlohmann/json 反序列化本工具生成的 struct

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++:用 rapidjson 解析 JSON 到本工具生成的 struct

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++:NLOHMANN_DEFINE_TYPE_INTRUSIVE 处理 snake_case 字段映射

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 格式。
 */

最佳实践

大多数团队建议先用 nlohmann::json,原因是其 API 与 STL 相似,反序列化时一行 j.get<User>() 就能搞定,可读性极高。只有遇到性能瓶颈(如每秒百万级 JSON 字段提取)时再切到 rapidjson。本工具生成的结构体与两者都能配合。

nlohmann/json 仓库rapidjson 仓库

使用 include(FetchContent) + FetchContent_Declare(nlohmann_json URL ...) 是 CMaker 集成 nlohmann/json 最干净的方式,无需预装 vcpkg;不想配 FetchContent 可用 vcpkg install nlohmann-json 或直接下载 json.hpp 单文件 include。

CMake FetchContent 官方文档

工具默认保持 JSON 原字段名(snake_case)。如果你希望 C++ 成员是 camelCase 或 PascalCase,需要在类内部添加 NLOHMANN_DEFINE_TYPE_INTRUSIVE(UserProfile, id, userName, ...) 把 JSON key 与 C++ 成员显式映射,否则反序列化会失败。

NLOHMANN_DEFINE_TYPE_INTRUSIVE 文档

C++17+ 直接使用 std::optional<T>;C++11/14 项目替换为 boost::optional<T>(#include <boost/optional.hpp>);C 风格项目用 cJSON + 哨兵字段(-1、空字符串)表示可空。注意 std::optional 与 boost::optional 的接口略有差异(has_value() vs is_initialized())。

cppreference std::optional

在 Arduino Uno / ESP8266 等 RAM 极小的设备上,std::vector 与 std::string 通常会触发 OOM。改用 ArduinoJson 6.x + StaticJsonDocument<容量> 限定缓冲区,并把 std::vector<T> 替换为固定大小 std::array<T, N>,std::string 替换为 const char* + 长度。

ArduinoJson 文档

本工具所有解析、代码生成、文件下载都在浏览器本地通过 Web Worker 完成,原始 JSON 不会被上传到任何服务器。但仍建议:① 内部业务模型先脱敏(去掉 token / 手机号等);② 关页面即清除内存;③ 大公司合规场景下,建议在 IDE 内用本地 quicktype 命令行处理含客户信息的 JSON。

超过 6 层嵌套的 JSON 建议在源端重构,或者在本工具生成后手动把深层嵌套拆成中间结构体以提升可读性与编译速度。深嵌套会导致模板实例化深度过深,部分老编译器(GCC 6 以下)报 'template instantiation depth exceeded' 错误。

本工具生成的代码本质是 C++(用到了 std::optional / template 等 C++ 特性),推荐用 .hpp 后缀表示 'C++ header',与 C header 的 .h 区分。CMake 项目中:set_target_properties(target PROPERTIES CXX_EXTENSIONS ON);CMake 也能通过 .h vs .hpp 自动识别该用 gcc 还是 g++ 编译,最大限度避免 header-only 模板不被重新实例化的问题。

GCC 文件后缀规范CMake 文件类型识别

常见问题

怎么把 JSON 转成 C++ 结构体 / 类定义?

在左侧编辑器粘贴 JSON 内容(也支持拖拽或点击上传 .json / .txt 文件),工具会在 400ms 内自动调用 quicktype-core 在浏览器本地生成 C++ 头文件代码;右侧 CodeMirror 区域显示带 std::string / std::vector<T> / 嵌套 class 的结构体代码。如 JSON 格式错误,可点击「修复 JSON」按钮自动修复后再转换。

生成的 C++ 代码需要包含什么头文件?

工具输出的是仅依赖 C++ 标准库(<string>、<vector>、<optional>、<cstdint>)的 header-only 结构体代码。配合 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 值。

JSON 字段类型如何映射到 C++ 类型?

字符串映射为 std::string;整数映射为 int64_t(也常用 long long 兼容旧代码);浮点数映射为 double;布尔值映射为 bool;数组映射为 std::vector<T>;嵌套对象映射为独立 struct / class;null 值映射为 std::optional<T>(可能用 nlohmann::json 兜底)。详细映射规则可参考页面下方的「JSON 类型到 C++ 类型映射速查表」。

null 值会生成什么类型?

JSON 中的 null 值会生成 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 仅作为数据模型参考。

snake_case JSON 字段如何处理?

工具会保持 JSON 原字段名生成 C++ 字段(如 user_name),如果你希望 C++ 成员使用 camelCase(userName)或 PascalCase(UserName),可在生成后手动修改并添加 JSNOMacros(NLOHMANN_DEFINE_TYPE_INTRUSIVE / NLOHMANN_JSON_FROM / NLOHMANN_JSON_TO)指定映射。

生成的头文件可以直接放到 Qt / Unreal / Boost 项目里用吗?

可以。本工具生成的是 header-only 标准 C++ 代码,不依赖特定框架。配合 Qt QJsonObject 解析时,把结构体当数据模型(成员用 Q_GADGET 标注);配合 Unreal Engine 时,配合 FJsonObjectConverter::JsonObjectStringToUStruct 使用;配合 Boost.JSON 时,把 JSON 解析为 boost::json::object 后逐字段提取。

数据会上传到服务器吗?隐私安全吗?

完全本地浏览器运行。所有 JSON 解析、C++ 代码生成、文件下载全部在浏览器内通过 JavaScript(Web Worker + quicktype-core)完成,输入的 JSON 数据和生成的 C++ 代码都不会被上传到任何服务器,也不会被记录或缓存到云端。包含 API key、token、未公开业务字段的敏感 JSON 可以放心使用,关闭页面即清除。

需要注册或登录吗?

不需要。工具完全免费,无需注册、登录或授权。打开页面即可使用,所有功能在浏览器本地可用,无任何调用次数或文件大小限制(受浏览器内存约束)。

JSON 格式错误怎么办?

工具会自动检测 JSON 合法性,错误时会在右侧显示红色错误提示,并提供「修复 JSON」按钮。点击后可自动修复常见错误:末尾多余逗号、单引号替换为双引号、缺失引号的 key 补全引号、注释移除等。修复成功后会继续生成 C++ 代码。

这个工具和 JSON 转 Java / 转 Rust 有什么区别?

三者都是把 JSON 转成目标语言的类型定义,但输出形态不同:JSON 转 C++ 生成的是 header-only struct / class,需要你额外配合 nlohmann/json 或 rapidjson 编写反序列化代码;JSON 转 Java 生成的是完整 POJO 类,含 getter/setter,可直接编译运行;JSON 转 Rust 生成的是带 Serde derive 的 struct,可直接 serde_json 反序列化。选择取决于你的技术栈。

故障排查

提示「请输入 JSON 数据」或右侧为空

左侧输入框为空或只有空白字符。确保已粘贴有效的 JSON 内容,或点击上传按钮选择 .json / .txt 文件,也可以点击示例按钮加载内置样例(含嵌套 address / tags 字段)。

提示 JSON 解析失败

常见原因:末尾有多余逗号、使用了单引号而非双引号、key 未加双引号、包含 JavaScript 注释。点击「修复 JSON」按钮可自动修复部分错误;如果仍失败,请先用 JSON 格式化工具校验。

编译报错「std::optional 未声明」

项目未使用 C++17 及以上标准。std::optional 是 C++17 引入的。在 CMakeLists.txt 把 CMAKE_CXX_STANDARD 设置为 17 或更高(或用 set(CMAKE_CXX_STANDARD 17));或在源码顶部加 #include <optional> 并确认编译器版本。

编译报错「int64_t 未声明」

工具使用 <cstdint> 中的 int64_t,需要 GCC 4.5+ / Clang 3.0+ / MSVC 2015+。检查源文件顶部是否包含 #include <cstdint> 或 #include <stdint.h>,并确认 CMake C++ 标准设置 >= C++11。

nlohmann::json 反序列化时丢失字段

可能原因:① JSON 字段名与 C++ 成员名不完全匹配(snake_case vs camelCase);② 嵌套对象未被正确处理;③ std::optional 字段的 value() 访问抛异常。解决:添加 NLOHMANN_DEFINE_TYPE_INTRUSIVE 宏明确字段映射,或使用 j.value("key", default) 提供默认值。

rapidjson 解析 GetString 段错误

rapidjson 默认不会校验字段类型。GetString 仅在字段确实存在且为字符串类型时安全。改进写法:if (doc.HasMember("name") && doc["name"].IsString()) { u.name = doc["name"].GetString(); },避免对不存在的 key 直接 GetInt / GetString。

生成的字段类型不够精确(所有整型都是 int64_t)

工具按 JSON 样本推断类型,所有整数都是 int64_t、所有字符串都是 std::string。如果你需要 int32_t、uint64_t、std::chrono::system_clock::time_point 等更精确类型,请在生成后手动修改字段类型,并确保所选 JSON 解析库支持该类型的反序列化。

null 字段生成了 std::optional<nlohmann::json> 而不是 std::optional<std::string>

因为 JSON null 无法推断具体类型,工具会安全地兜底为 std::optional<nlohmann::json>。如果你知道字段实际类型,可在源 JSON 中给出一个示例值(如 "field": "" 推断为 std::string)重新生成,再手动改为 std::optional<std::string>。

snake_case JSON 字段与 C++ 命名风格不一致

工具会保持 JSON 原字段名生成 C++ 字段(如 user_name)。如果你希望 C++ 成员使用 camelCase(userName)同时又能正确反序列化 snake_case JSON,参考 codeExamples 第 3 段使用 NLOHMANN_DEFINE_TYPE_INTRUSIVE / NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE 宏。

下载的 .hpp 文件在项目中编译报错

可能原因:① CMake 未设置 C++17 / C++20 标准;② 缺少 <optional> / <vector> 等头文件;③ 结构体名与项目中其他类型冲突。解决:在 CMakeLists.txt 添加 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 与 C 语言 char* / char[] 不同:std::string 自动管理内存、支持运算符重载(+、==、<),但只在处理小到中等长度字符串时性能最佳;超长字符串(如日志整行 1KB+)建议改用 std::string_view 或自定义 buffer。
std::vector<T>
C++ 标准库的动态数组容器(<vector>),等价于 Java 的 ArrayList、Python 的 list、JavaScript 的 Array。本工具把 JSON 数组字段自动映射为 std::vector<T>,如 std::vector<std::string> tags。优势:连续内存、随机访问 O(1)、尾部追加 O(1) 摊销;劣势:中间插入 O(n)。需要固定大小数组时可用 std::array<T, N>(栈上分配)。
std::optional<T>
C++17 起标准库的可选值包装类型(<optional>),表示值可能不存在。典型用法:std::optional<std::string> nickname; if (nickname) { use(*nickname); }。本工具把可能为 null 的 JSON 字段映射为 std::optional<T>,例如 std::optional<std::string> nickname。如果你的项目必须使用 C++11/14,可替换为 boost::optional<T>,API 几乎一致。
int64_t / double
int64_t 是 <cstdint> 中固定宽度的 64 位整数类型别名,等价于 long long,跨平台保证 8 字节。double 是 C++ 的双精度浮点类型(IEEE 754 双精度 / binary64,约 15-17 位有效数字)。本工具把 JSON 整数统一映射为 int64_t、浮点数统一映射为 double,避免跨平台 long 大小不一致(Windows long 为 32 位,Linux long 为 64 位)导致的精度问题。需要精确浮点(财务计算)可用 long double 或 decimal 库。
nlohmann::json
C++ 生态中最流行的 JSON 库之一,又称 nlohmann/json,由德国 nlohmann 发布,作者为 Niels Lohmann。它的核心思想是把 JSON 数据结构映射为 C++ 标准库类型(如 std::map、std::vector、std::string),反序列化时可通过 j.get<T>() 一行完成。本工具生成的代码可与 nlohmann/json 配合,使用 NLOHMANN_DEFINE_TYPE_INTRUSIVE、NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE 等宏实现自动反序列化。单头依赖、文档丰富、API 与 STL 风格一致,是大多数 C++ 项目的首选。
rapidjson
腾讯开源的高性能 JSON 库(C++),代码量约 5k 行,性能约为 nlohmann::json 的 3-5 倍。支持 SAX(流式)和 DOM(文档对象模型)两种解析风格,对 SIMD 指令(如 SSE42)有专门加速实现。典型场景:金融交易行情推送、游戏引擎对象序列化、嵌入式高性能日志。本工具生成的 struct 可作为 rapidjson Document / GenericValue 反序列化的目标模型,但因 rapidjson 无模板反射,需手动 GetObject / GetString 提取字段。
Web Worker / quicktype-core
Web Worker 是浏览器提供的后台线程 API,与主线程并行执行,不能访问主线程的 DOM,只能通过 postMessage 通信。quicktype-core 是开源的 JSON → 多语言代码生成器库(GitHub: quicktype/quicktype),支持 C++/Java/TypeScript/Rust/Go/Python/Swift 等十余种语言。本工具基于 quicktype-core 在浏览器本地为 C++ 渲染 header-only 结构体代码,原始数据不上传到任何服务器,所有解析、生成、下载均在浏览器内完成。Worker 加载 quicktype-core 避免阻塞 UI 主线程。
snake_case / camelCase / PascalCase
三种主流的字段命名风格:snake_case(user_name,C / Python / DB 首选)、camelCase(userName,Java / JS 首选)、PascalCase(UserName,C# / Rust struct 字段首选)。本工具默认保持 JSON 原字段名(一般是 snake_case),你可在生成后手动调整并添加 NLOHMANN 宏声明映射。注意 C++ 公有字段命名规范推荐 camelCase 或 snake_case,PascalCase 主要用于类名(Google C++ Style)、不推荐用于成员;snake_case 与 mySQL 列名天然兼容。
NLOHMANN_DEFINE_TYPE_INTRUSIVE
nlohmann/json 库提供的宏,用于在类内部声明 JSON 序列化字段映射。语法为 NLOHMANN_DEFINE_TYPE_INTRUSIVE(ClassName, member1, member2, ...),必须放在 public 区域(要让宏访问私有字段)。非侵入式版本 NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE 放在类外,无需修改类本身。本工具生成的 struct 不自动添加此类宏,需要时手动添加以声明 JSON key 与 C++ 成员的对应关系。如果 JSON 字段名与 C++ 成员同名,可省略此宏直接 j.get<T>()。

JSON 类型到 C++ 类型映射速查表

工具根据 JSON 值的类型自动推断对应的 C++ 类型:

JSON 值示例生成 C++ 类型说明
nullstd::optional<T>null 值类型不确定,用 std::optional<T> 兜底(C++17+)
true / falseboolJSON 布尔值直接映射为 C++ bool
42int64_tJSON 整数默认映射为 int64_t(<cstdint>),兼容 long long
3.14doubleJSON 浮点数默认映射为 double(IEEE 754 双精度)
"hello"std::stringJSON 字符串映射为 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 兜底(也可改写为 std::vector<std::string>)
{...} 嵌套对象独立 struct / class嵌套对象生成独立 struct,PascalCase 命名(address → Address)

常用 C++ JSON 解析器选型对比表

C++ 生态中主流的 JSON 解析库对比,根据项目需求选择:

库名API 风格性能适用场景
nlohmann::json模板 / STL-likeWeb 后端、桌面应用、教学;与 std::vector / std::map 兼容最好
rapidjsonSAX / DOM极高金融交易、游戏引擎、高吞吐服务;支持 SIMD 加速
Boost.JSONBoost.ContainerBoost 生态项目、Web 服务器(Beast / Asio)
cJSONC 风格 / 函数式C 项目、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 内容、上传的文件或生成的代码。文件上传使用浏览器原生 FileReader API 直接读取到内存,不经过任何中间服务。不使用 Cookie 追踪,不收集任何用户输入或使用数据。关闭或刷新页面后,所有输入和输出内容自动从内存清除。适合处理含 API 密钥、token、敏感业务数据的 JSON。

Authoritative References