JSON 转 C++
暂无内容
免费在线 JSON 转 C++ 工具。粘贴 JSON 自动生成可直接编译的 C++ struct / class 头文件代码,适合用 nlohmann/json 或 rapidjson 反序列化 API 响应,嵌套对象自动拆分为独立类,std::vector 与 std::optional 自动处理,纯浏览器本地运行。
暂无内容
免费在线 JSON 转 C++ 工具。粘贴 JSON 自动生成可直接编译的 C++ struct / class 头文件代码,适合用 nlohmann/json 或 rapidjson 反序列化 API 响应,嵌套对象自动拆分为独立类,std::vector 与 std::optional 自动处理,纯浏览器本地运行。
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++ 结构体的快捷入口。
把生成的 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
*/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 指令加速。
*/当 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 内容(也支持拖拽或点击上传 .json / .txt 文件),工具会在 400ms 内自动调用 quicktype-core 在浏览器本地生成 C++ 头文件代码;右侧 CodeMirror 区域显示带 std::string / std::vector<T> / 嵌套 class 的结构体代码。如 JSON 格式错误,可点击「修复 JSON」按钮自动修复后再转换。
工具输出的是仅依赖 C++ 标准库(<string>、<vector>、<optional>、<cstdint>)的 header-only 结构体代码。配合 nlohmann/json 解析时,需要额外 #include <nlohmann/json.hpp>;配合 rapidjson 解析时,需要 #include "rapidjson/document.h"。其余标准头文件工具会按需声明。
支持所有合法 JSON 结构:基本类型(null、boolean、number、string)、数组(一维或多维)、嵌套对象(任意深度)。JSON 对象会生成根 struct / class,JSON 数组会作为 std::vector<T> 形式出现在上层结构体的某字段中。不支持 JavaScript 对象字面量、函数、Symbol、undefined 等非 JSON 值。
字符串映射为 std::string;整数映射为 int64_t(也常用 long long 兼容旧代码);浮点数映射为 double;布尔值映射为 bool;数组映射为 std::vector<T>;嵌套对象映射为独立 struct / class;null 值映射为 std::optional<T>(可能用 nlohmann::json 兜底)。详细映射规则可参考页面下方的「JSON 类型到 C++ 类型映射速查表」。
JSON 中的 null 值会生成 std::optional<T>(C++17 起可用),表示该字段可能缺失或类型不确定。如果你已经知道字段实际类型,可在源 JSON 中给出一个示例值(如 "field": "" 推断为 std::string),生成后再根据业务需求改为 std::optional<std::string> 等更精确的类型。
会。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 j; j["root"] = nlohmann::json::parse(raw_json); User u = j.get<User>(); 前提是项目已引入 nlohmann/json 单头依赖(直接 include <nlohmann/json.hpp>),并已定义好本工具生成的 User 结构体。
可以。rapidjson 需要你手动编写 GetObject 类型的字段提取代码。典型路径:rapidjson::Document doc; doc.Parse(raw_json); const auto& obj = doc["root"]; std::string id = obj["id"].GetString(); 因为 rapidjson 不通过模板支持自动反序列化,生成的 struct 仅作为数据模型参考。
工具会保持 JSON 原字段名生成 C++ 字段(如 user_name),如果你希望 C++ 成员使用 camelCase(userName)或 PascalCase(UserName),可在生成后手动修改并添加 JSNOMacros(NLOHMANN_DEFINE_TYPE_INTRUSIVE / NLOHMANN_JSON_FROM / NLOHMANN_JSON_TO)指定映射。
可以。本工具生成的是 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」按钮。点击后可自动修复常见错误:末尾多余逗号、单引号替换为双引号、缺失引号的 key 补全引号、注释移除等。修复成功后会继续生成 C++ 代码。
三者都是把 JSON 转成目标语言的类型定义,但输出形态不同:JSON 转 C++ 生成的是 header-only struct / class,需要你额外配合 nlohmann/json 或 rapidjson 编写反序列化代码;JSON 转 Java 生成的是完整 POJO 类,含 getter/setter,可直接编译运行;JSON 转 Rust 生成的是带 Serde derive 的 struct,可直接 serde_json 反序列化。选择取决于你的技术栈。
左侧输入框为空或只有空白字符。确保已粘贴有效的 JSON 内容,或点击上传按钮选择 .json / .txt 文件,也可以点击示例按钮加载内置样例(含嵌套 address / tags 字段)。
常见原因:末尾有多余逗号、使用了单引号而非双引号、key 未加双引号、包含 JavaScript 注释。点击「修复 JSON」按钮可自动修复部分错误;如果仍失败,请先用 JSON 格式化工具校验。
项目未使用 C++17 及以上标准。std::optional 是 C++17 引入的。在 CMakeLists.txt 把 CMAKE_CXX_STANDARD 设置为 17 或更高(或用 set(CMAKE_CXX_STANDARD 17));或在源码顶部加 #include <optional> 并确认编译器版本。
工具使用 <cstdint> 中的 int64_t,需要 GCC 4.5+ / Clang 3.0+ / MSVC 2015+。检查源文件顶部是否包含 #include <cstdint> 或 #include <stdint.h>,并确认 CMake C++ 标准设置 >= C++11。
可能原因:① JSON 字段名与 C++ 成员名不完全匹配(snake_case vs camelCase);② 嵌套对象未被正确处理;③ std::optional 字段的 value() 访问抛异常。解决:添加 NLOHMANN_DEFINE_TYPE_INTRUSIVE 宏明确字段映射,或使用 j.value("key", default) 提供默认值。
rapidjson 默认不会校验字段类型。GetString 仅在字段确实存在且为字符串类型时安全。改进写法:if (doc.HasMember("name") && doc["name"].IsString()) { u.name = doc["name"].GetString(); },避免对不存在的 key 直接 GetInt / GetString。
工具按 JSON 样本推断类型,所有整数都是 int64_t、所有字符串都是 std::string。如果你需要 int32_t、uint64_t、std::chrono::system_clock::time_point 等更精确类型,请在生成后手动修改字段类型,并确保所选 JSON 解析库支持该类型的反序列化。
因为 JSON null 无法推断具体类型,工具会安全地兜底为 std::optional<nlohmann::json>。如果你知道字段实际类型,可在源 JSON 中给出一个示例值(如 "field": "" 推断为 std::string)重新生成,再手动改为 std::optional<std::string>。
工具会保持 JSON 原字段名生成 C++ 字段(如 user_name)。如果你希望 C++ 成员使用 camelCase(userName)同时又能正确反序列化 snake_case JSON,参考 codeExamples 第 3 段使用 NLOHMANN_DEFINE_TYPE_INTRUSIVE / NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE 宏。
可能原因:① CMake 未设置 C++17 / C++20 标准;② 缺少 <optional> / <vector> 等头文件;③ 结构体名与项目中其他类型冲突。解决:在 CMakeLists.txt 添加 set(CMAKE_CXX_STANDARD 17)、在源文件顶部添加相应头、用 namespace 包裹或重命名冲突的结构体。
工具根据 JSON 值的类型自动推断对应的 C++ 类型:
| JSON 值示例 | 生成 C++ 类型 | 说明 |
|---|---|---|
null | std::optional<T> | null 值类型不确定,用 std::optional<T> 兜底(C++17+) |
true / false | bool | JSON 布尔值直接映射为 C++ bool |
42 | int64_t | JSON 整数默认映射为 int64_t(<cstdint>),兼容 long long |
3.14 | double | 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 兜底(也可改写为 std::vector<std::string>) |
{...} 嵌套对象 | 独立 struct / class | 嵌套对象生成独立 struct,PascalCase 命名(address → Address) |
C++ 生态中主流的 JSON 解析库对比,根据项目需求选择:
| 库名 | API 风格 | 性能 | 适用场景 |
|---|---|---|---|
nlohmann::json | 模板 / STL-like | 中 | Web 后端、桌面应用、教学;与 std::vector / std::map 兼容最好 |
rapidjson | SAX / DOM | 极高 | 金融交易、游戏引擎、高吞吐服务;支持 SIMD 加速 |
Boost.JSON | Boost.Container | 高 | Boost 生态项目、Web 服务器(Beast / Asio) |
cJSON | C 风格 / 函数式 | 高 | C 项目、C++ 嵌入式、不想引入 C++ 模板的场景 |
ArduinoJson | C++ 模板 | 中 | Arduino、ESP32 / ESP8266、嵌入式 MCU |
C++ 标准库中与 JSON 字段对应的核心类型一览,便于开发者快速查阅:
| JSON 关键词 | C++ 标准库对应 | 所需头文件 | C++ 标准 |
|---|---|---|---|
| string | std::string | <string> | C++98 |
| integer | int64_t(<cstdint>) | <cstdint> | C++11 |
| number | double | <iostream> / <cmath> | C++98 |
| boolean | bool | <stdbool.h>(C) / 内置 | C++98 |
| null | std::optional<T> | <optional> | C++17 |
| array | std::vector<T> | <vector> | C++98 |
| array 固定 | std::array<T, N> | <array> | C++11 |
| object / map | std::map<std::string, T> | <map> | C++98 |
| object 哈希 | std::unordered_map<K, T> | <unordered_map> | C++11 |
| string view | std::string_view(不拥有数据) | <string_view> | C++17 |
| byte / char | std::byte / char | <cstddef> | C++17 / C++98 |
本 JSON 转 C++ 工具所有操作完全在你的浏览器本地完成:JSON 解析、C++ 结构体生成、文件下载全部通过浏览器 JavaScript(Web Worker + quicktype-core)在客户端执行,不会通过网络向任何服务器发送 JSON 内容、上传的文件或生成的代码。文件上传使用浏览器原生 FileReader API 直接读取到内存,不经过任何中间服务。不使用 Cookie 追踪,不收集任何用户输入或使用数据。关闭或刷新页面后,所有输入和输出内容自动从内存清除。适合处理含 API 密钥、token、敏感业务数据的 JSON。