logo
GeekFormat

Công cụ JSON sang C++ trực tuyến miễn phí. Dán JSON để tự động tạo code file header C++ struct / class có thể biên dịch trực tiếp, thích hợp để giải tuần tự hóa phản hồi API với nlohmann/json hoặc rapidjson, đối tượng lồng nhau tự động tách thành lớp độc lập, std::vector và std::optional được xử lý tự động, chạy hoàn toàn cục bộ trên trình duyệt.

Đề xuất Liên quan

Về JSON sang C++: Biến dữ liệu JSON thành cấu trúc C++ có thể biên dịch

JSON sang C++ là quá trình chuyển đổi dữ liệu định dạng JSON (đối tượng hoặc mảng) thành định nghĩa kiểu struct / class C++. C++ là ngôn ngữ lập trình hệ thống với hệ thống kiểu mạnh, được sử dụng rộng rãi trong các tình huống như dịch vụ backend, engine game, firmware nhúng, giao dịch định lượng, dịch vụ hiệu suất cao và client desktop. Trong quá trình phát triển thường cần chuyển mẫu JSON từ tài liệu API hoặc phản hồi thực tế thành kiểu C++, viết struct thủ công không chỉ nhiều công việc lặp lại mà còn dễ viết sai kiểu trường, mục tiêu của công cụ này là tự động hóa quá trình này. C++ khác với Java, Python, JavaScript ở chỗ thiếu hỗ trợ gốc cho cấu trúc động như JSON, vì vậy 'JSON sang C++' từ lâu được coi là công việc 'lặp lại nhưng không thể bỏ qua' trong giới kỹ thuật.

Công cụ này chạy cục bộ trên trình duyệt dựa trên quicktype-core, sử dụng tùy chọn kết xuất CPP renderer và just-types để tạo code cấu trúc dựa trên std::string / std::vector<T> / std::optional<T> cho C++. Code tạo ra là code C++ tiêu chuẩn header-only không phụ thuộc bất kỳ thư viện phân tích JSON bên thứ ba nào, có thể #include trực tiếp vào bất kỳ dự án C++17 / C++20 nào. Khi sử dụng với bộ phân tích nlohmann/json hoặc rapidjson, có thể nhanh chóng hoàn thành giải tuần tự hóa phản hồi API. Toàn bộ quy trình kết xuất hoàn thành không đồng bộ trong trình duyệt qua Web Worker, luồng chính vẫn duy trì phản hồi mượt mà.

Suy luận kiểu là cốt lõi của JSON sang C++. Công cụ sẽ ánh xạ kiểu cơ bản của JSON sang kiểu tiêu chuẩn C++: chuỗi ánh xạ std::string, số nguyên ánh xạ int64_t (tương thích long long, tránh sự khác biệt kích thước long đa nền tảng), số thực ánh xạ double, giá trị boolean ánh xạ bool, mảng ánh xạ std::vector<T>, đối tượng lồng nhau ánh xạ struct / class độc lập, giá trị null ánh xạ std::optional<T>. Đối với đối tượng lồng nhau, công cụ sẽ tự động tạo class mới cho mỗi cấp và đặt tên theo PascalCase, ví dụ trường address sẽ tạo cấu trúc Address, đối tượng trong mảng items sẽ tạo cấu trúc Item. Cùng một cấp lồng JSON chỉ tạo một lần, không định nghĩa lặp lại.

Khác với một số công cụ trực tuyến yêu cầu tải JSON lên máy chủ để xử lý, tất cả tính toán của công cụ này đều hoàn thành trong trình duyệt. quicktype-core được tải và thực thi qua Web Worker, phân tích JSON, suy luận kiểu, tạo code C++, tải xuống file đều thực hiện cục bộ, không gửi dữ liệu đến bất kỳ máy chủ nào. Điều này đặc biệt quan trọng đối với JSON chứa API key, trường riêng tư người dùng, cấu trúc nghiệp vụ chưa ra mắt, dữ liệu sẽ bị xóa ngay khỏi bộ nhớ khi đóng trang. Dù môi trường mạng công ty, yêu cầu kiểm toán nội bộ, hay tình huống phát triển ngoại tuyến, công cụ này đều có thể cung cấp độ tin cậy tương đương công cụ dòng lệnh quicktype.

Code sau khi tạo thường cần sử dụng cùng với bộ phân tích JSON. Có hai lựa chọn chính: ① nlohmann::json (khuyến nghị, giới thiệu đơn header, giao diện tuần tự hóa template thân thiện, cách viết tương tự nlohmann::json j = nlohmann::json::parse(str); User u = j.get<User>();); ② rapidjson (phân tích kiểu SAX / DOM hiệu suất cao, thích hợp cho các tình huống cực hạn như tài chính, game, cần thủ công GetObject để trích xuất trường). Đối với nhúng, cũng có thể sử dụng ArduinoJson (tài nguyên hạn chế) hoặc cJSON (giao diện kiểu C). Code của công cụ này tương thích với tất cả thư viện JSON C++ chính, không ép buộc gắn với một hệ sinh thái cụ thể.

Cần lưu ý rằng code tự động tạo là điểm khởi đầu chứ không phải điểm cuối. Công cụ suy luận kiểu từ mẫu JSON, không thể xác định kiểu chính xác về mặt nghiệp vụ (ví dụ các kiểu ngữ nghĩa như URL, Email, ID đều sẽ được suy luận nhất quán là std::string). Đối với trường JSON snake_case, trường struct C++ sẽ được tạo giữ nguyên, bạn có thể cần thủ công thêm NLOHMANN_DEFINE_TYPE_INTRUSIVE hoặc NLOHMANN_JSON_FROM / NLOHMANN_JSON_TO để khai báo quan hệ ánh xạ. Khuyến nghị sử dụng kết quả tạo ra làm bản nháp, sau đó tinh chỉnh tên trường, kiểu và chú thích tuần tự hóa theo quy phạm dự án. Luồng công việc 'AI viết bản nháp + kỹ sư duyệt' này cũng là nhịp độ thực tế của nhiều đội ngũ C++.

Trong tình huống hợp tác đa nhóm, JSON sang C++ cũng là cầu nối thống nhất mô hình dữ liệu. Frontend sử dụng JSON sang TypeScript, backend sử dụng JSON sang Java / Go / Rust, nhúng và dịch vụ hiệu suất sử dụng JSON sang C++, bốn phía sử dụng cùng một mẫu JSON để tạo định nghĩa kiểu tương ứng, có thể đảm bảo tính nhất quán trường tối đa. Công cụ này là 'phía C++' trong luồng công việc này, có thể sử dụng đồng thời với các công cụ JSON sang TypeScript / Java / Rust / Go / Python khác trên trang.

Tóm lại một câu: Nếu code của bạn chạy trong dự án C++ nhạy cảm về hiệu suất, kiểu mạnh, hệ sinh thái phong phú, và cần kết nối nhanh dữ liệu động như JSON vào thế giới kiểu mạnh, thì công cụ này chính là lối vào nhanh chóng để biên dịch mẫu JSON thành cấu trúc C++.

Trường hợp sử dụng

  • Tích hợp REST API: Chuyển phản hồi JSON trả về từ backend thành struct C++, giải tuần tự hóa yêu cầu HTTP kiểu mạnh với nlohmann::json / cpr
  • Định nghĩa giao diện microservice: Chuyển JSON mẫu yêu cầu của dịch vụ gRPC / HTTP thành kiểu C++, thống nhất định nghĩa mô hình phía máy chủ
  • Nhúng & IoT: Chuyển dữ liệu cảm biến JSON được báo cáo từ thiết bị thành struct C++, phân tích bản tin MQTT / HTTP với ArduinoJson hoặc ESP-IDF JSON Parser
  • Phát triển game: Chuyển JSON cấu hình màn chơi, thuộc tính nhân vật thành struct C++, thuận tiện cho các engine như Unreal Engine hoặc Cocos2d-x đọc file dữ liệu .json
  • Giao dịch tần suất cao tài chính: Chuyển phản hồi giao diện JSON của sàn giao dịch (như OKX / Binance / thị trường Xueqiu) thành struct C++, phân tích tốc độ nano giây với rapidjson
  • Client C++ Qt: Chuyển cấu hình JSON của máy chủ thành struct C++, tải dữ liệu GUI với QJsonObject / QJsonDocument
  • Boost.JSON / Boost.Beast: Chuyển phản hồi JSON của dịch vụ HTTP thành struct C++, giải tuần tự hóa với Boost.JSON để viết backend web
  • RTOS nhúng: Chuyển JSON cấu hình hệ thống FreeRTOS / Zephyr thành struct C++, đọc tham số firmware với cJSON
  • Thuật toán / định lượng: Chuyển cấu hình JSON của hệ thống backtesting thành struct C++, thuận tiện quản lý cấu hình thử nghiệm A/B và truy vết phiên bản
  • Di chuyển cơ sở dữ liệu: Chuyển tài liệu JSON xuất từ MongoDB / PostgreSQL thành mô hình C++, làm tham chiếu cho trường thực thể cpp-httplib / libpqxx
  • Âm thanh/video / đa phương tiện: Chuyển JSON cấu hình FFmpeg / GStreamer thành struct C++, thuận tiện đọc tham số đường ống media
  • Mô phỏng & mô hình hóa: Chuyển cấu hình đầu vào JSON của hệ thống mô phỏng thành struct C++, thống nhất định dạng dữ liệu đầu vào giữa các mô hình con khác nhau
  • Xây dựng dữ liệu kiểm thử: Chuyển JSON fixture thực từ phản hồi backend thành kiểu C++, thực hiện khẳng định có cấu trúc trong kiểm thử đơn vị Google Test / Catch2
  • Phân tích nhật ký có cấu trúc: Chuyển nhật ký JSON được thu thập bởi ELK / Loki thành kiểu C++, thuận tiện cho việc lọc và quy tắc cảnh báo
  • Di chuyển trung tâm cấu hình: Chuyển cấu hình JSON của Apollo / Nacos / Consul thành kiểu C++, sử dụng cho tải nóng cấu hình phía máy chủ
  • Hợp tác đa ngôn ngữ: Backend C++ tích hợp với frontend TypeScript / Java, cùng một JSON được chuyển thành struct C++ và interface TS / Java POJO tương ứng để giữ nhất quán hai phía
  • Giảng dạy & đào tạo: Trong khóa học C++, chuyển JSON mẫu thành struct, trình diễn quá trình giải tuần tự hóa nlohmann::json và khái niệm lập trình template metaprogramming
  • Chuyển đổi đặt tên trường: Sau khi chuyển phản hồi JSON API snake_case thành cấu trúc C++, thủ công thêm NLOHMANN_DEFINE_TYPE_INTRUSIVE để thực hiện ánh xạ trường

Cách Sử dụng

  1. Dán nội dung JSON vào trình soạn thảo bên trái (khuyến nghị đối tượng JSON), hoặc nhấp nút tải lên để chọn file .json / .txt
  2. Công cụ sử dụng quicktype-core qua Web Worker để tự động chuyển đổi trong vòng 400ms, bên phải hiển thị code header C++ với std::string / std::vector<T> / class lồng nhau
  3. Nếu có lỗi định dạng JSON sẽ hiển thị thông báo đỏ, nhấp nút 'Sửa JSON' để tự động sửa các vấn đề phổ biến như dấu phẩy cuối, dấu nháy đơn rồi thử lại
  4. Kiểm tra xem tên struct / class tạo ra, kiểu trường có phù hợp với kỳ vọng không; nếu cần điều chỉnh có thể sửa tên key của JSON nguồn rồi chuyển đổi lại
  5. Nhấp 'Sao chép' để dán code vào file .h / .hpp trong IDE, giải tuần tự hóa phản hồi API thực với nlohmann/json hoặc rapidjson; hoặc nhấp 'Tải xuống' để lưu thành model.h / model.hpp

Tính năng

  • Chuyển đổi cục bộ trình duyệt: Phân tích JSON và tạo code C++ đều hoàn thành trong trình duyệt qua Web Worker + quicktype-core, dữ liệu gốc không tải lên máy chủ nào
  • Đầu ra kiểu nlohmann::json: Tự động tạo struct kiểu STL như std::string / std::vector<T> / double / int64_t / bool, theo thói quen giải tuần tự hóa nlohmann::json, có thể include <nlohmann/json.hpp> trực tiếp để phân tích
  • Tương thích rapidjson: Struct C++ thuần tạo ra không phụ thuộc thư viện bên thứ ba, có thể sử dụng với rapidjson Document / GenericValue cho các tình huống phân tích hiệu suất cao
  • Suy luận kiểu tự động: Chuỗi JSON ánh xạ std::string, số nguyên ánh xạ int64_t / long long, số thực ánh xạ double, boolean ánh xạ bool, mảng ánh xạ std::vector<T>, đối tượng lồng nhau ánh xạ class / struct độc lập
  • Tự động tách đối tượng lồng nhau: JSON lồng nhau tự động tạo class / struct độc lập (đặt tên PascalCase), tránh định nghĩa lặp lại cùng một kiểu
  • Tự động xử lý std::vector và std::optional: Mảng JSON chuyển thành std::vector<T>, trường có thể null chuyển thành std::optional<T> dự phòng, tuân thủ thực tiễn C++17 / C++20 hiện đại
  • Tự động chuyển đổi với debounce 400ms: Sau khi dán JSON tự động kích hoạt chuyển đổi, xem trước code header C++ thời gian thực ở bên phải, giảm thời gian chờ và nhấp chuột thừa
  • Sửa lỗi JSON một cú nhấp: Tự động sửa các lỗi định dạng phổ biến như dấu phẩy cuối, dấu nháy đơn, thiếu dấu nháy, tiếp tục tạo code sau khi sửa thành công
  • Tô màu cú pháp code + sao chép một cú nhấp: CodeMirror bên phải hiển thị tô màu cú pháp C++, sao chép toàn bộ file header một cú nhấp, hoặc tải xuống dưới dạng file .h / .hpp để đưa trực tiếp vào dự án
  • Lịch sử nhập localStorage + chia cột responsive: Tự động lưu nhập gần đây, khôi phục nhanh sau khi làm mới hoặc đóng trang nhầm; dán JSON bên trái, xem code C++ bên phải, hỗ trợ kéo điều chỉnh độ rộng bảng điều khiển, thích ứng màn hình lớn và di động
  • Sản phẩm header-only không phụ thuộc: File .h / .hpp tạo ra ở dạng header-only, có thể include đơn file vào bất kỳ dự án C++ tiêu chuẩn nào, không cần cấu hình xây dựng bổ sung để sử dụng với nlohmann::json / rapidjson / Boost.JSON
  • Tích hợp sẵn snake_case sang camelCase: Có thể tự động chuyển trường snake_case trong JSON thành tên trường camelCase được đề xuất cho C++, kết hợp với NLOHMANN_DEFINE_TYPE_INTRUSIVE để duy trì ánh xạ tuần tự hóa snake_case

Ví dụ mã

C++: Giải tuần tự hóa struct tạo bởi công cụ này bằng nlohmann/json

cpp

Đặt cấu trúc User tạo ra vào .hpp, giải tuần tự hóa với nlohmann::json (khuyến nghị dự án C++17/20 hiện đại).

// 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++: Phân tích JSON thành struct tạo bởi công cụ này bằng rapidjson

cpp

rapidjson không hỗ trợ giải tuần tự hóa tự động đến struct tùy chỉnh, cần thủ công trích xuất GetObject. Thích hợp cho các tình huống hiệu suất cao như tài chính / game.

#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++: Xử lý ánh xạ trường snake_case với NLOHMANN_DEFINE_TYPE_INTRUSIVE

cpp

Khi trường JSON là snake_case và thành viên C++ nên sử dụng camelCase / PascalCase, khai báo ánh xạ bằng macro 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", "a**@***********"},
        {"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

Hầu hết các đội ngũ khuyến nghị sử dụng nlohmann::json trước, vì API của nó tương tự STL, giải tuần tự hóa có thể hoàn thành với một dòng j.get<User>(), khả năng đọc cực kỳ cao. Chỉ chuyển sang rapidjson khi gặp nút cổ chai hiệu suất (ví dụ: hàng triệu trường trích xuất JSON mỗi giây). Cấu trúc tạo bởi công cụ này hoạt động với cả hai.

Kho nlohmann/jsonKho rapidjson

Sử dụng include(FetchContent) + FetchContent_Declare(nlohmann_json URL ...) là cách sạch sẽ nhất để tích hợp nlohmann/json với CMake, không cần cài đặt sẵn vcpkg; không muốn cấu hình FetchContent có thể sử dụng vcpkg install nlohmann-json hoặc trực tiếp tải xuống đơn file json.hpp để include.

Tài liệu chính thức CMake FetchContent

Công cụ mặc định giữ nguyên tên trường gốc JSON (snake_case). Nếu bạn muốn thành viên C++ là camelCase hoặc PascalCase, cần thêm NLOHMANN_DEFINE_TYPE_INTRUSIVE(UserProfile, id, userName, ...) bên trong lớp để ánh xạ rõ ràng khóa JSON với thành viên C++; nếu không giải tuần tự hóa sẽ thất bại.

Tài liệu NLOHMANN_DEFINE_TYPE_INTRUSIVE

C++17+ trực tiếp sử dụng std::optional<T>; dự án C++11/14 thay thế bằng boost::optional<T> (#include <boost/optional.hpp>); dự án kiểu C sử dụng cJSON + trường sentinel (-1, chuỗi rỗng) để biểu thị có thể null. Lưu ý giao diện của std::optional và boost::optional hơi khác nhau (has_value() vs is_initialized()).

cppreference std::optional

Trên các thiết bị RAM cực nhỏ như Arduino Uno / ESP8266, std::vector và std::string thường kích hoạt OOM. Thay vào đó sử dụng ArduinoJson 6.x + StaticJsonDocument<dung lượng> để giới hạn bộ đệm, thay std::vector<T> bằng std::array<T, N> kích thước cố định, std::string bằng const char* + chiều dài.

Tài liệu ArduinoJson

Tất cả phân tích, tạo code, tải xuống file của công cụ này đều hoàn thành cục bộ trên trình duyệt qua Web Worker, JSON gốc không được tải lên máy chủ nào. Nhưng vẫn khuyến nghị: ① Trước tiên hãy ẩn danh mô hình nghiệp vụ nội bộ (loại bỏ token / số điện thoại, v.v.); ② Đóng trang để xóa bộ nhớ; ③ Trong tình huống tuân thủ công ty lớn, khuyến nghị sử dụng dòng lệnh quicktype cục bộ trong IDE để xử lý JSON chứa thông tin khách hàng.

JSON có mức lồng hơn 6 lớp khuyến nghị tái cấu trúc ở phía nguồn, hoặc sau khi tạo bởi công cụ này hãy thủ công tách lồng sâu thành cấu trúc trung gian để tăng khả năng đọc và tốc độ biên dịch. Lồng sâu có thể dẫn đến độ sâu khởi tạo template quá sâu, một số trình biên dịch cũ (GCC 6 trở xuống) báo lỗi 'template instantiation depth exceeded'.

Code tạo bởi công cụ này về bản chất là C++ (sử dụng các tính năng C++ như std::optional / template), khuyến nghị sử dụng hậu tố .hpp để biểu thị 'C++ header', phân biệt với .h của C header. Trong dự án CMake: set_target_properties(target PROPERTIES CXX_EXTENSIONS ON); CMake cũng có thể tự động nhận dạng nên biên dịch bằng gcc hay g++ thông qua .h vs .hpp, tối đa tránh vấn đề template header-only không được khởi tạo lại.

Quy phạm hậu tố file GCCNhận dạng loại file CMake

Câu hỏi Thường gặp

Làm thế nào để chuyển đổi JSON thành định nghĩa struct / lớp C++?

Dán nội dung JSON vào trình soạn thảo bên trái (cũng hỗ trợ kéo thả hoặc nhấp để tải lên file .json / .txt), công cụ sẽ tự động gọi quicktype-core trong vòng 400ms để tạo code file header C++ cục bộ trên trình duyệt; khu vực CodeMirror bên phải hiển thị code struct với std::string / std::vector<T> / class lồng nhau. Nếu JSON có lỗi định dạng, có thể nhấp nút 'Sửa JSON' để tự động sửa trước khi chuyển đổi.

Code C++ tạo ra cần include những file header nào?

Công cụ xuất ra code cấu trúc header-only chỉ phụ thuộc thư viện chuẩn C++ (<string>, <vector>, <optional>, <cstdint>). Khi phân tích với nlohmann/json, cần thêm #include <nlohmann/json.hpp>; khi phân tích với rapidjson, cần #include "rapidjson/document.h". Các file header chuẩn khác công cụ sẽ khai báo khi cần.

Hỗ trợ những cấu trúc dữ liệu JSON nào?

Hỗ trợ tất cả cấu trúc JSON hợp lệ: kiểu cơ bản (null, boolean, number, string), mảng (một chiều hoặc đa chiều), đối tượng lồng nhau (độ sâu bất kỳ). Đối tượng JSON sẽ tạo struct / class gốc, mảng JSON sẽ xuất hiện dưới dạng std::vector<T> trong một trường của cấu trúc cha. Không hỗ trợ giá trị không phải JSON như object literal JavaScript, hàm, Symbol, undefined.

Kiểu trường JSON ánh xạ sang kiểu C++ như thế nào?

Chuỗi ánh xạ std::string; số nguyên ánh xạ int64_t (cũng thường dùng long long tương thích code cũ); số thực ánh xạ double; giá trị boolean ánh xạ bool; mảng ánh xạ std::vector<T>; đối tượng lồng nhau ánh xạ struct / class độc lập; giá trị null ánh xạ std::optional<T> (có thể dùng nlohmann::json dự phòng). Xem bảng 'Bảng tra cứu nhanh ánh xạ kiểu JSON sang kiểu C++' ở cuối trang để biết quy tắc ánh xạ chi tiết.

Giá trị null sẽ tạo ra kiểu gì?

Giá trị null trong JSON sẽ tạo std::optional<T> (có sẵn từ C++17), cho biết trường đó có thể bị thiếu hoặc không xác định kiểu. Nếu bạn đã biết kiểu thực của trường, có thể cung cấp giá trị mẫu trong JSON nguồn (ví dụ "field": "" suy luận là std::string), sau khi tạo có thể thay đổi thành kiểu chính xác hơn như std::optional<std::string> theo nhu cầu nghiệp vụ.

Mảng có tự động chuyển thành std::vector không?

Có. Mảng JSON được chuyển đổi nhất quán thành container template std::vector<T> của C++, kiểu phần tử tự động suy luận từ phần tử đầu tiên của mảng. Ví dụ ["a","b"] tạo std::vector<std::string>, [1,2,3] tạo std::vector<int64_t>, [{...},{...}] tạo std::vector<Item> (Item là struct độc lập tạo từ đối tượng lồng nhau).

Đối tượng lồng nhau được xử lý như thế nào?

Mỗi đối tượng lồng nhau sẽ tạo struct / class độc lập, quy tắc đặt tên là PascalCase của tên trường (ví dụ trường address tạo cấu trúc Address, đối tượng trong mảng items tạo cấu trúc Item). Trong cấu trúc gốc tham chiếu lớp lồng nhau thông qua thành viên kiểu std::optional<Address> hoặc Address. Các đối tượng có cùng cấu trúc sẽ được tái sử dụng cùng một kiểu, tránh định nghĩa lặp lại.

Code tạo ra có thể giải tuần tự hóa với nlohmann/json không?

Có. Ví dụ sử dụng điển hình: nlohmann::json j; j["root"] = nlohmann::json::parse(raw_json); User u = j.get<User>(); Điều kiện tiên quyết là dự án đã đưa vào phụ thuộc đơn header nlohmann/json (include trực tiếp <nlohmann/json.hpp>), và cấu trúc User tạo bởi công cụ này đã được định nghĩa.

Code tạo ra có thể giải tuần tự hóa với rapidjson không?

Có. rapidjson yêu cầu bạn viết thủ công code trích xuất trường kiểu GetObject. Đường dẫn điển hình: rapidjson::Document doc; doc.Parse(raw_json); const auto& obj = doc["root"]; std::string id = obj["id"].GetString(); Vì rapidjson không hỗ trợ giải tuần tự hóa tự động qua template, struct tạo ra chỉ dùng làm tham chiếu mô hình dữ liệu.

Trường JSON snake_case được xử lý như thế nào?

Công cụ sẽ giữ nguyên tên trường gốc của JSON để tạo trường C++ (ví dụ user_name). Nếu bạn muốn thành viên C++ sử dụng camelCase (userName) hoặc PascalCase (UserName), có thể sửa thủ công sau khi tạo và thêm JSNOMacros (NLOHMANN_DEFINE_TYPE_INTRUSIVE / NLOHMANN_JSON_FROM / NLOHMANN_JSON_TO) để chỉ định ánh xạ.

File header tạo ra có thể đưa trực tiếp vào dự án Qt / Unreal / Boost để sử dụng không?

Có. Công cụ này tạo code C++ tiêu chuẩn header-only không phụ thuộc framework cụ thể. Khi phân tích với Qt QJsonObject, sử dụng struct làm mô hình dữ liệu (đánh dấu thành viên bằng Q_GADGET); với Unreal Engine, sử dụng cùng FJsonObjectConverter::JsonObjectStringToUStruct; với Boost.JSON, phân tích JSON thành boost::json::object sau đó trích xuất từng trường.

Dữ liệu có được tải lên máy chủ không? Quyền riêng tư có an toàn không?

Hoàn toàn chạy trên trình duyệt cục bộ. Tất cả phân tích JSON, tạo code C++, tải xuống file đều hoàn thành trong trình duyệt qua JavaScript (Web Worker + quicktype-core). Dữ liệu JSON bạn nhập và code C++ tạo ra không được tải lên bất kỳ máy chủ nào, cũng không được ghi lại hoặc lưu đệm lên đám mây. JSON nhạy cảm chứa API key, token, trường nghiệp vụ chưa công khai có thể yên tâm sử dụng, đóng trang là xóa.

Cần đăng ký hoặc đăng nhập không?

Không cần. Công cụ hoàn toàn miễn phí, không cần đăng ký, đăng nhập hoặc ủy quyền. Mở trang là có thể sử dụng, tất cả tính năng khả dụng cục bộ trên trình duyệt, không có giới hạn số lần gọi hoặc kích thước file (bị ràng buộc bởi bộ nhớ trình duyệt).

Phải làm gì nếu JSON sai định dạng?

Công cụ sẽ tự động kiểm tra tính hợp lệ của JSON. Khi có lỗi sẽ hiển thị thông báo lỗi màu đỏ ở bên phải và cung cấp nút 'Sửa JSON'. Nhấp vào có thể tự động sửa các lỗi phổ biến: dấu phẩy thừa ở cuối, thay dấu nháy đơn thành dấu nháy kép, hoàn thành dấu nháy bị thiếu cho key, xóa chú thích, v.v. Sau khi sửa thành công sẽ tiếp tục tạo code C++.

Công cụ này khác gì với JSON sang Java / JSON sang Rust?

Cả ba đều chuyển đổi JSON thành định nghĩa kiểu ngôn ngữ đích, nhưng hình thức đầu ra khác nhau: JSON sang C++ tạo struct / class header-only cần bạn viết thêm code giải tuần tự hóa với nlohmann/json hoặc rapidjson; JSON sang Java tạo lớp POJO hoàn chỉnh với getter/setter, có thể biên dịch và chạy trực tiếp; JSON sang Rust tạo struct với Serde derive, có thể giải tuần tự hóa trực tiếp bằng serde_json. Lựa chọn phụ thuộc vào stack công nghệ của bạn.

Xử lý sự cố

Hiển thị lời nhắc 'Vui lòng nhập dữ liệu JSON' hoặc bên phải trống

Hộp nhập bên trái trống hoặc chỉ chứa ký tự trắng. Đảm bảo đã dán nội dung JSON hợp lệ, hoặc nhấp nút tải lên để chọn file .json / .txt, cũng có thể nhấp nút ví dụ để tải mẫu tích hợp sẵn (chứa trường address / tags lồng nhau).

Hiển thị phân tích JSON thất bại

Nguyên nhân phổ biến: có dấu phẩy thừa ở cuối, sử dụng dấu nháy đơn thay vì dấu nháy kép, key không có dấu nháy kép, chứa chú thích JavaScript. Nhấp nút 'Sửa JSON' có thể tự động sửa một số lỗi; nếu vẫn thất bại, vui lòng kiểm tra trước bằng công cụ định dạng JSON.

Lỗi biên dịch 'std::optional chưa được khai báo'

Dự án không sử dụng chuẩn C++17 trở lên. std::optional được giới thiệu trong C++17. Trong CMakeLists.txt đặt CMAKE_CXX_STANDARD thành 17 hoặc cao hơn (hoặc sử dụng set(CMAKE_CXX_STANDARD 17)); hoặc thêm #include <optional> ở đầu file nguồn và xác nhận phiên bản trình biên dịch.

Lỗi biên dịch 'int64_t chưa được khai báo'

Công cụ sử dụng int64_t từ <cstdint>, cần GCC 4.5+ / Clang 3.0+ / MSVC 2015+. Kiểm tra xem đầu file nguồn có bao gồm #include <cstdint> hoặc #include <stdint.h> không, và xác nhận chuẩn CMake C++ được đặt >= C++11.

Mất trường khi giải tuần tự hóa nlohmann::json

Nguyên nhân có thể: ① Tên trường JSON không khớp chính xác với tên thành viên C++ (snake_case vs camelCase); ② Đối tượng lồng nhau không được xử lý chính xác; ③ Truy cập value() trên trường std::optional ném ngoại lệ. Giải quyết: thêm macro NLOHMANN_DEFINE_TYPE_INTRUSIVE để ánh xạ trường rõ ràng, hoặc sử dụng j.value("key", default) để cung cấp giá trị mặc định.

Lỗi phân đoạn GetString khi phân tích rapidjson

rapidjson mặc định không kiểm tra kiểu trường. GetString chỉ an toàn khi trường thực sự tồn tại và là kiểu chuỗi. Cách viết cải tiến: if (doc.HasMember("name") && doc["name"].IsString()) { u.name = doc["name"].GetString(); }, tránh gọi trực tiếp GetInt / GetString trên key không tồn tại.

Kiểu trường tạo ra không đủ chính xác (tất cả số nguyên là int64_t)

Công cụ suy luận kiểu từ mẫu JSON, tất cả số nguyên là int64_t, tất cả chuỗi là std::string. Nếu bạn cần kiểu chính xác hơn như int32_t, uint64_t, std::chrono::system_clock::time_point, vui lòng sửa thủ công kiểu trường sau khi tạo, và đảm bảo thư viện phân tích JSON đã chọn hỗ trợ giải tuần tự hóa cho kiểu đó.

Trường null tạo std::optional<nlohmann::json> thay vì std::optional<std::string>

Vì JSON null không thể suy luận kiểu cụ thể, công cụ sẽ dự phòng an toàn thành std::optional<nlohmann::json>. Nếu bạn biết kiểu thực của trường, có thể cung cấp giá trị mẫu trong JSON nguồn (ví dụ "field": "" suy luận là std::string) để tạo lại, sau đó thủ công đổi thành std::optional<std::string>.

Trường JSON snake_case không nhất quán với phong cách đặt tên C++

Công cụ sẽ giữ nguyên tên trường gốc của JSON để tạo trường C++ (ví dụ user_name). Nếu bạn muốn thành viên C++ sử dụng camelCase (userName) đồng thời giải tuần tự hóa chính xác JSON snake_case, tham khảo đoạn 3 codeExamples sử dụng macro NLOHMANN_DEFINE_TYPE_INTRUSIVE / NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE.

File .hpp tải xuống báo lỗi biên dịch trong dự án

Nguyên nhân có thể: ① CMake không đặt chuẩn C++17 / C++20; ② Thiếu file header như <optional> / <vector>; ③ Tên cấu trúc xung đột với kiểu khác trong dự án. Giải quyết: thêm set(CMAKE_CXX_STANDARD 17) trong CMakeLists.txt, thêm header tương ứng ở đầu file nguồn, bọc bằng namespace hoặc đổi tên cấu trúc bị xung đột.

Thuật ngữ

struct / class
Từ khóa trong C++ dùng để định nghĩa kiểu dữ liệu phức hợp. Công cụ này tạo ra chính là struct, ví dụ struct User { int64_t id; std::string name; }. Trong C++ struct và class gần như tương đương (quyền truy cập mặc định khác nhau: thành viên struct mặc định public, thành viên class mặc định private), công cụ mặc định tạo struct. Trong tình huống giải tuần tự hóa, sử dụng struct ngắn gọn và trực quan hơn; nếu cần đóng gói thành viên private + phương thức truy cập, có thể thủ công đổi thành class.
std::string
Kiểu chuỗi của thư viện chuẩn C++ (ngữ nghĩa sở hữu), được định nghĩa trong <string>. Công cụ này tự động ánh xạ trường chuỗi JSON thành std::string, ví dụ std::string name. Lưu ý std::string khác với char* / char[] ngôn ngữ C: std::string tự động quản lý bộ nhớ, hỗ trợ nạp chồng toán tử (+, ==, <), nhưng hiệu suất tốt nhất chỉ khi xử lý chuỗi độ dài nhỏ đến trung bình; chuỗi cực dài (như toàn bộ dòng nhật ký 1KB+) khuyến nghị改用 std::string_view hoặc buffer tùy chỉnh.
std::vector<T>
Container mảng động của thư viện chuẩn C++ (<vector>), tương đương với ArrayList của Java, list của Python, Array của JavaScript. Công cụ này tự động ánh xạ trường mảng JSON thành std::vector<T>, ví dụ std::vector<std::string> tags. Ưu điểm: bộ nhớ liên tục, truy cập ngẫu nhiên O(1), thêm cuối O(1) phân rã; nhược điểm: chèn giữa O(n). Khi cần mảng kích thước cố định có thể sử dụng std::array<T, N> (phân bổ trên stack).
std::optional<T>
Kiểu bao bọc giá trị tùy chọn của thư viện chuẩn từ C++17 (<optional>), biểu thị giá trị có thể không tồn tại. Cách sử dụng điển hình: std::optional<std::string> nickname; if (nickname) { use(*nickname); }. Công cụ này ánh xạ trường JSON có thể null thành std::optional<T>, ví dụ std::optional<std::string> nickname. Nếu dự án của bạn phải sử dụng C++11/14, có thể thay thế bằng boost::optional<T> (#include <boost/optional.hpp>), API gần như nhất quán.
int64_t / double
int64_t là bí danh kiểu số nguyên 64 bit chiều rộng cố định trong <cstdint>, tương đương long long, đảm bảo 8 byte đa nền tảng. double là kiểu số thực dấu phẩy động kép của C++ (IEEE 754 kép / binary64, khoảng 15-17 chữ số có nghĩa). Công cụ này nhất quán ánh xạ số nguyên JSON thành int64_t, số thực thành double, tránh vấn đề độ chính xác do sự không nhất quán kích thước long đa nền tảng (Windows long là 32 bit, Linux long là 64 bit). Khi cần số thực chính xác (tính toán tài chính) có thể sử dụng long double hoặc thư viện decimal.
nlohmann::json
Một trong những thư viện JSON phổ biến nhất trong hệ sinh thái C++, còn gọi là nlohmann/json, do Niels Lohmann phát hành. Ý tưởng cốt lõi của nó là ánh xạ cấu trúc dữ liệu JSON thành kiểu thư viện chuẩn C++ (như std::map, std::vector, std::string), khi giải tuần tự hóa có thể hoàn thành với một dòng j.get<T>(). Code tạo bởi công cụ này có thể sử dụng cùng nlohmann/json, sử dụng macro như NLOHMANN_DEFINE_TYPE_INTRUSIVE, NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE để triển khai giải tuần tự hóa tự động. Phụ thuộc đơn header, tài liệu phong phú, API nhất quán với phong cách STL, là lựa chọn hàng đầu cho hầu hết các dự án C++.
rapidjson
Thư viện JSON hiệu suất cao mã nguồn mở của Tencent (C++), số lượng code khoảng 5k dòng, hiệu suất gấp khoảng 3-5 lần nlohmann::json. Hỗ trợ hai kiểu phân tích SAX (streaming) và DOM (mô hình đối tượng tài liệu), có triển khai tăng tốc đặc biệt cho lệnh SIMD (như SSE42). Tình huống điển hình: đẩy thị trường giao dịch tài chính, tuần tự hóa đối tượng engine game, nhật ký hiệu suất cao nhúng. Struct tạo bởi công cụ này có thể làm mô hình đích cho giải tuần tự hóa rapidjson Document / GenericValue, nhưng vì rapidjson không có phản xạ template, cần thủ công GetObject / GetString để trích xuất trường.
Web Worker / quicktype-core
Web Worker là API luồng nền được cung cấp bởi trình duyệt, thực thi song song với luồng chính, không thể truy cập DOM của luồng chính, chỉ có thể giao tiếp qua postMessage. quicktype-core là thư viện tạo code đa ngôn ngữ JSON mã nguồn mở (GitHub: quicktype/quicktype), hỗ trợ hơn mười ngôn ngữ bao gồm C++/Java/TypeScript/Rust/Go/Python/Swift. Công cụ này dựa trên quicktype-core để kết xuất code cấu trúc header-only cho C++ cục bộ trên trình duyệt, dữ liệu gốc không tải lên máy chủ nào, tất cả phân tích, tạo, tải xuống đều hoàn thành trong trình duyệt. Worker tải quicktype-core để tránh chặn luồng chính UI.
snake_case / camelCase / PascalCase
Ba phong cách đặt tên trường chính: snake_case (user_name, ưu tiên C / Python / DB), camelCase (userName, ưu tiên Java / JS), PascalCase (UserName, ưu tiên trường struct C# / Rust). Công cụ này mặc định giữ nguyên tên trường gốc JSON (thường là snake_case), bạn có thể điều chỉnh thủ công sau khi tạo và thêm macro NLOHMANN để khai báo ánh xạ. Lưu ý quy phạm đặt tên trường công khai C++ khuyến nghị camelCase hoặc snake_case, PascalCase chủ yếu dùng cho tên lớp (Google C++ Style), không khuyến nghị cho thành viên; snake_case tương thích tự nhiên với tên cột mySQL.
NLOHMANN_DEFINE_TYPE_INTRUSIVE
Macro được cung cấp bởi thư viện nlohmann/json, dùng để khai báo ánh xạ trường tuần tự hóa JSON bên trong lớp. Cú pháp là NLOHMANN_DEFINE_TYPE_INTRUSIVE(ClassName, member1, member2, ...), phải được đặt trong khu vực public (để macro truy cập trường private). Phiên bản không xâm nhập NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE đặt bên ngoài lớp, không cần sửa đổi bản thân lớp. Struct tạo bởi công cụ này không tự động thêm macro này, khi cần hãy thủ công thêm để khai báo quan hệ tương ứng giữa khóa JSON và thành viên C++. Nếu tên trường JSON trùng với tên thành viên C++, có thể bỏ qua macro này và trực tiếp sử dụng j.get<T>().

Bảng tra cứu nhanh ánh xạ kiểu JSON sang kiểu C++

Công cụ tự động suy luận kiểu C++ tương ứng dựa trên kiểu giá trị JSON:

Ví dụ giá trị JSONKiểu C++ tạo raGhi chú
nullstd::optional<T>Giá trị null không xác định kiểu, dùng std::optional<T> dự phòng (C++17+)
true / falseboolGiá trị boolean JSON ánh xạ trực tiếp thành bool C++
42int64_tSố nguyên JSON mặc định ánh xạ thành int64_t (<cstdint>), tương thích long long
3.14doubleSố thực JSON mặc định ánh xạ thành double (kép IEEE 754)
"hello"std::stringChuỗi JSON ánh xạ thành std::string (<string>)
["a","b"]std::vector<std::string>Mảng chuỗi ánh xạ thành std::vector<std::string>
[1,2,3]std::vector<int64_t>Mảng số nguyên ánh xạ thành std::vector<int64_t>
[{...},{...}]std::vector<Item>Mảng đối tượng tạo struct tương ứng từ phần tử đầu tiên, sau đó gói bằng std::vector
[]std::vector<nlohmann::json>Mảng rỗng không thể suy luận kiểu phần tử, dùng nlohmann::json dự phòng (cũng có thể đổi thành std::vector<std::string>)
{...} đối tượng lồng nhaustruct / class độc lậpĐối tượng lồng nhau tạo struct độc lập, đặt tên PascalCase (address → Address)

Bảng so sánh lựa chọn bộ phân tích JSON C++ phổ biến

So sánh các thư viện phân tích JSON chính trong hệ sinh thái C++, lựa chọn theo nhu cầu dự án:

Tên thư việnPhong cách APIHiệu suấtTình huống áp dụng
nlohmann::jsonTemplate / STL-likeTrung bìnhBackend web, ứng dụng desktop, giảng dạy; tương thích tốt nhất với std::vector / std::map
rapidjsonSAX / DOMCực caoGiao dịch tài chính, engine game, dịch vụ thông lượng cao; hỗ trợ tăng tốc SIMD
Boost.JSONBoost.ContainerCaoDự án hệ sinh thái Boost, máy chủ web (Beast / Asio)
cJSONKiểu C / hàmCaoDự án C, nhúng C++, tình huống không muốn đưa vào template C++
ArduinoJsonTemplate C++Trung bìnhArduino, ESP32 / ESP8266, MCU nhúng

Bảng tra cứu nhanh kiểu thư viện chuẩn C++ phổ biến và tương ứng JSON

Tổng hợp các kiểu cốt lõi trong thư viện chuẩn C++ tương ứng với trường JSON, thuận tiện cho nhà phát triển tra cứu nhanh:

Từ khóa JSONTương ứng thư viện chuẩn C++File header cần thiếtChuẩn C++
stringstd::string<string>C++98
integerint64_t (<cstdint>)<cstdint>C++11
numberdouble<iostream> / <cmath>C++98
booleanbool<stdbool.h>(C) / tích hợpC++98
nullstd::optional<T><optional>C++17
arraystd::vector<T><vector>C++98
array cố địnhstd::array<T, N><array>C++11
object / mapstd::map<std::string, T><map>C++98
object bămstd::unordered_map<K, T><unordered_map>C++11
string viewstd::string_view (không sở hữu dữ liệu)<string_view>C++17
byte / charstd::byte / char<cstddef>C++17 / C++98

Privacy & Security

Tất cả thao tác của công cụ JSON sang C++ này hoàn thành cục bộ trên trình duyệt của bạn: phân tích JSON, tạo cấu trúc C++, tải xuống file đều thực thi phía khách qua JavaScript trình duyệt (Web Worker + quicktype-core), không gửi nội dung JSON, file đã tải lên hoặc code tạo ra đến bất kỳ máy chủ nào qua mạng. Tải lên file sử dụng API FileReader gốc của trình duyệt để đọc trực tiếp vào bộ nhớ, không đi qua bất kỳ dịch vụ trung gian nào. Không sử dụng theo dõi Cookie, không thu thập bất kỳ dữ liệu nhập hoặc sử dụng nào của người dùng. Sau khi đóng hoặc làm mới trang, tất cả nội dung nhập và xuất tự động bị xóa khỏi bộ nhớ. Thích hợp xử lý JSON chứa khóa API, token, dữ liệu nghiệp vụ nhạy cảm.

Authoritative References