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", "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 轉成 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