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", "al********@***********"},
{"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。