logo
GeekFormat

JSON을 C++로

무료 온라인 JSON to C++ 도구입니다. JSON을 붙여넣으면 컴파일 가능한 C++ struct / class 헤더 파일 코드가 자동 생성되며, nlohmann/json이나 rapidjson으로 API 응답을 역직렬화하는 데 적합합니다. 중첩 객체는 자동으로 독립 클래스로 분할되고, std::vector와 std::optional은 자동으로 처리되며, 순수 브라우저 로컬에서 실행됩니다.

관련 추천

JSON to C++ 정보: JSON 데이터를 컴파일 가능한 C++ 구조체로 변환

JSON to C++는 JSON 형식의 데이터(객체 또는 배열)를 C++ struct / class 타입 정의로 변환하는 과정입니다. C++는 강력한 타입 시스템을 가진 프로그래밍 언어로, 백엔드 서비스, 게임 엔진, 임베디드 펌웨어, 퀀트 트레이딩, 고성능 서비스, 데스크톱 클라이언트 등의 시나리오에서 널리 사용됩니다. 개발 중에는 API 문서나 실제 응답의 JSON 샘플을 C++ 타입으로 변환해야 하는 경우가 많은데, 수동으로 struct를 작성하는 것은 반복 작업이 많을 뿐만 아니라 필드 타입을 잘못 작성하기 쉽습니다. 이 도구의 목표는 이 과정을 자동화하는 것입니다. C++는 Java, Python, JavaScript와 달리 JSON 같은 동적 구조에 대한 네이티브 지원이 부족하므로 'JSON to C++'는 엔지니어링 분야에서 오랫동안 '반복적이지만 생략할 수 없는' 작업으로 여겨져 왔습니다.

이 도구는 브라우저 로컬에서 quicktype-core를 기반으로 실행되며, CPP 렌더러와 just-types 렌더링 옵션을 사용하여 std::string / std::vector<T> / std::optional<T> 기반의 C++용 구조체 코드를 생성합니다. 생성되는 것은 타사 JSON 파싱 라이브러리에 의존하지 않는 header-only 표준 C++ 코드로, 모든 C++17 / C++20 프로젝트에 직접 #include할 수 있습니다. nlohmann/json이나 rapidjson 파서와 함께 사용하면 API 응답의 역직렬화를 빠르게 완료할 수 있습니다. 전체 렌더링 프로세스는 Web Worker를 통해 브라우저 내에서 비동기적으로 완료되어 메인 스레드가 원활하게 응답합니다.

타입 추론은 JSON to 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 키, 사용자 개인정보 필드, 출시되지 않은 비즈니스 구조가 포함된 JSON에 특히 중요하며, 페이지를 닫으면 데이터가 메모리에서 즉시 삭제됩니다. 회사 네트워크 환경, 내부 감사 요구 사항, 또는 오프라인 개발 시나리오에서도 이 도구는 quicktype 명령줄 도구와 동등한 신뢰성을 제공합니다.

생성된 코드는 일반적으로 JSON 파서와 함께 사용해야 합니다. 주류 선택지는 두 가지가 있습니다: ① nlohmann::json(권장, 단일 헤더 도입, 템플릿 직렬화 인터페이스가 친숙하며, 작성 방식은 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 to C++는 데이터 모델을 통일하는 다리이기도 합니다. 프론트엔드는 JSON to TypeScript를 사용하고, 백엔드는 JSON to Java / Go / Rust를 사용하며, 임베디드와 성능 서비스는 JSON to C++를 사용하여, 네 가지 측이 동일한 JSON 샘플에서 각자의 타입 정의를 생성하면 필드 일관성을 최대한 보장할 수 있습니다. 이 도구는 이 워크플로의 'C++ 측'이며, 사이트 내 다른 JSON to TypeScript / Java / Rust / Go / Python 도구와 동시에 사용할 수 있습니다.

한 마디로 요약: 코드가 성능에 민감하고 강력한 타입을 가지며 생태계가 풍부한 C++ 프로젝트에서 실행되고, JSON 같은 동적 데이터를 강력한 타입 세계에 빠르게 연결해야 한다면, 이 도구는 JSON 샘플을 C++ 구조체로 직접 컴파일하는 빠른 입구입니다.

사용 사례

  • REST API 연동: 백엔드에서 반환된 JSON 응답을 C++ 구조체로 변환하여 nlohmann::json / cpr로 강력한 타입의 HTTP 요청 역직렬화
  • 마이크로서비스 인터페이스 정의: gRPC / HTTP 서비스의 요청 본문 예제 JSON을 C++ 타입으로 변환하여 서버 측 모델 정의 통일
  • 임베디드 & IoT: 디바이스에서 보고한 JSON 센서 데이터를 C++ 구조체로 변환하여 ArduinoJson이나 ESP-IDF JSON Parser로 MQTT / HTTP 메시지 파싱
  • 게임 개발: 레벨 구성, 캐릭터 속성 JSON을 C++ 구조체로 변환하여 Unreal Engine이나 Cocos2d-x 등의 엔진에서 .json 데이터 파일 읽기 용이
  • 금융 고빈도 거래: 거래소 JSON 인터페이스 응답(OKX / Binance / 설구 시세)을 C++ 구조체로 변환하여 rapidjson으로 나노초 단위 파싱
  • C++ Qt 클라이언트: 서버 JSON 구성을 C++ 구조체로 변환하여 QJsonObject / QJsonDocument로 GUI 데이터 로드
  • Boost.JSON / Boost.Beast: HTTP 서비스의 JSON 응답을 C++ 구조체로 변환하여 Boost.JSON으로 역직렬화하여 웹 백엔드 작성
  • 임베디드 RTOS: FreeRTOS / Zephyr 시스템 구성 JSON을 C++ 구조체로 변환하여 cJSON으로 펌웨어 매개변수 읽기
  • 알고리즘 / 퀀트: 백테스팅 시스템의 JSON 구성을 C++ 구조체로 변환하여 A/B 실험 구성 관리와 버전 추적 용이
  • 데이터베이스 마이그레이션: MongoDB / PostgreSQL에서 내보낸 JSON 문서를 C++ 모델로 변환하여 cpp-httplib / libpqxx 엔티티 필드의 참조로 사용
  • 오디오/비디오 / 멀티미디어: FFmpeg / GStreamer 구성 JSON을 C++ 구조체로 변환하여 미디어 파이프라인 매개변수 읽기 편의
  • 시뮬레이션 & 모델링: 시뮬레이션 시스템의 JSON 입력 구성을 C++ 구조체로 변환하여 하위 모델 전체의 입력 데이터 형식 통일
  • 테스트 데이터 구성: 백엔드 응답의 실제 JSON fixture를 C++ 타입으로 변환하여 Google Test / Catch2 단위 테스트에서 구조화된 어설션
  • 구조화된 로그 파싱: ELK / Loki에서 수집한 JSON 로그를 C++ 타입으로 변환하여 필터링과 알림 규칙 용이
  • 구성 센터 마이그레이션: Apollo / Nacos / Consul의 JSON 구성을 C++ 타입으로 변환하여 서버 측 구성 핫 리로드에 사용
  • 크로스랭귀지 협업: 백엔드 C++가 프론트엔드 TypeScript / Java와 연동할 때, 동일한 JSON을 각각 C++ 구조체와 TS 인터페이스 / Java POJO로 변환하여 양쪽 일관성 유지
  • 교육 & 훈련: C++ 강의에서 예제 JSON을 struct로 변환하여 nlohmann::json 역직렬화 과정과 템플릿 메타프로그래밍 개념 시연
  • 필드 명명 변환: snake_case JSON API 응답을 C++ 구조체로 변환한 후 수동으로 NLOHMANN_DEFINE_TYPE_INTRUSIVE를 추가하여 필드 매핑

이용 방법

  1. 왼쪽 편집기에 JSON 내용을 붙여넣고(JSON 객체 권장), 또는 업로드 버튼을 클릭하여 .json / .txt 파일을 선택합니다
  2. 도구는 Web Worker를 통해 quicktype-core를 사용하여 400ms 이내에 자동 변환하며, 오른쪽에 std::string / std::vector<T> / 중첩 class가 포함된 C++ 헤더 코드가 표시됩니다
  3. JSON 형식 오류가 있으면 빨간색 프롬프트가 표시되며, 'JSON 복구' 버튼을 클릭하여 trailing comma, 작은따옴표 등 일반적인 문제를 자동 복구한 후 재시도합니다
  4. 생성된 struct / class 이름과 필드 타입이 예상과 일치하는지 확인합니다; 필요한 경우 소스 JSON의 키 이름을 수정하고 다시 변환합니다
  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 역직렬화 관행에 가깝고, <nlohmann/json.hpp>를 직접 include하여 파싱할 수 있습니다
  • 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 오류 원클릭 복구: trailing comma, 작은따옴표, 따옴표 누락 등 일반적인 형식 오류를 자동으로 복구하고, 복구 성공 후 코드 생성을 계속합니다
  • 코드 하이라이팅 + 원클릭 복사: 오른쪽 CodeMirror에서 C++ 구문 하이라이팅을 렌더링하며, 헤더 파일 전체를 원클릭으로 복사하거나 .h / .hpp 파일로 다운로드하여 프로젝트에 직접 넣을 수 있습니다
  • localStorage 입력 기록 + 반응형 분할 패널: 최근 입력을 자동 저장하여 새로고침이나 실수로 페이지를 닫은 후에도 빠르게 복구할 수 있습니다; 왼쪽에 JSON을 붙여넣고 오른쪽에서 C++ 코드를 보며, 패널 너비 드래그 조정을 지원하여 대화면과 모바일에 적응합니다
  • 무의존성 header-only 결과물: 생성된 .h / .hpp는 header-only 형식으로, 표준 C++ 프로젝트에 단일 파일로 include할 수 있으며, 추가 빌드 설정 없이 nlohmann::json / rapidjson / Boost.JSON과 함께 사용할 수 있습니다
  • 내장된 snake_case to 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", "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

대부분의 팀은 먼저 nlohmann::json을 사용할 것을 권장합니다. API가 STL과 유사하고 역직렬화를 j.get<User>() 한 줄로 완료할 수 있으며 가독성이 매우 높기 때문입니다. 성능 병목 현상(예: 초당 수백만 건의 JSON 필드 추출)이 발생할 때만 rapidjson으로 전환하세요. 이 도구가 생성한 구조체는 둘 다와 함께 작동합니다.

nlohmann/json 리포지토리rapidjson 리포지토리

include(FetchContent) + FetchContent_Declare(nlohmann_json URL ...)를 사용하는 것이 CMake로 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 키와 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은 어떤 서버에도 업로드되지 않습니다. 하지만 여전히 권장합니다: ① 내부 비즈니스 모델은 먼저 비식별화할 것(토큰 / 전화번호 등 제거); ② 페이지를 닫아 메모리를 지울 것; ③ 대기업 규정 준수 시나리오에서는 IDE 내에서 로컬 quicktype 명령줄을 사용하여 고객 정보가 포함된 JSON을 처리할 것을 권장합니다.

6계층 이상 중첩된 JSON은 소스 측에서 리팩토링하거나, 이 도구로 생성한 후 수동으로 깊은 중첩을 중간 구조체로 분할하여 가독성과 컴파일 속도를 높이는 것이 좋습니다. 깊은 중첩은 템플릿 인스턴스화 깊이가 너무 깊어질 수 있으며, 일부 구형 컴파일러(GCC 6 이하)는 'template instantiation depth exceeded' 오류를 보고합니다.

이 도구가 생성하는 코드는 본질적으로 C++입니다(std::optional / template 등 C++ 기능을 사용). .hpp 접미사를 사용하여 'C++ 헤더'임을 나타내고 C 헤더의 .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), 배열(1차원 또는 다차원), 중첩 객체(임의 깊이). 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 단일 헤더 의존성이 도입되어 있고(<nlohmann/json.hpp> 직접 include), 이 도구로 생성된 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)를 사용하려면 생성 후 수동으로 수정하고 NLOHMANN 매크로(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 키, 토큰, 비공개 비즈니스 필드가 포함된 민감한 JSON도 안심하고 사용할 수 있으며, 페이지를 닫으면 데이터가 삭제됩니다.

회원가입이나 로그인이 필요한가요?

아니요. 도구는 완전히 무료이며, 회원가입, 로그인, 권한 부여가 필요 없습니다. 페이지를 열면 바로 사용할 수 있으며, 모든 기능은 브라우저 로컬에서 사용 가능하고 호출 횟수나 파일 크기 제한이 없습니다(브라우저 메모리 제약에 따름).

JSON 형식이 유효하지 않으면 어떻게 하나요?

도구는 JSON 유효성을 자동으로 검사합니다. 오류 시 오른쪽에 빨간색 오류 메시지가 표시되고 'JSON 복구' 버튼이 제공됩니다. 클릭하면 일반적인 오류를 자동으로 복구합니다: trailing comma, 작은따옴표를 큰따옴표로 교체, 키의 누락된 따옴표 완성, 주석 제거 등. 복구 성공 후 C++ 코드 생성이 계속됩니다.

이 도구와 JSON to Java / JSON to Rust의 차이점은 무엇인가요?

셋 다 JSON을 대상 언어의 타입 정의로 변환하지만 출력 형태가 다릅니다: JSON to C++는 역직렬화 코드에 nlohmann/json이나 rapidjson이 필요한 header-only struct / class를 생성하고; JSON to Java는 getter/setter가 포함된 완전한 POJO 클래스를 생성하여 직접 컴파일하고 실행할 수 있으며; JSON to Rust는 serde_json으로 직접 역직렬화할 수 있는 Serde derive가 포함된 struct를 생성합니다. 기술 스택에 따라 선택하세요.

문제 해결

'JSON 데이터를 입력하세요' 프롬프트가 표시되거나 오른쪽이 비어 있습니다

왼쪽 입력 상자가 비어 있거나 공백 문자만 있습니다. 유효한 JSON 내용이 붙여넣어졌는지 확인하거나, 업로드 버튼을 클릭하여 .json / .txt 파일을 선택하거나, 예제 버튼을 클릭하여 내장 샘플(중첩된 address / tags 필드 포함)을 로드할 수도 있습니다.

JSON 파싱 실패 프롬프트

일반적인 원인: 끝에 여분의 쉼표가 있거나, 작은따옴표를 큰따옴표 대신 사용했거나, 키에 따옴표가 없거나, 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(); }, 존재하지 않는 키에 직접 GetInt / GetString을 호출하지 마세요.

생성된 필드 타입이 충분히 정확하지 않습니다(모든 정수가 int64_t)

도구는 JSON 샘플에서 타입을 추론하므로 모든 정수는 int64_t이고 모든 문자열은 std::string입니다. int32_t, uint64_t, std::chrono::system_clock::time_point 등 더 정확한 타입이 필요한 경우 생성 후 수동으로 필드 타입을 수정하고, 선택한 JSON 파싱 라이브러리가 해당 타입의 역직렬화를 지원하는지 확인하세요.

null 필드가 std::optional<std::string> 대신 std::optional<nlohmann::json>을 생성했습니다

JSON null은 구체적인 타입을 추론할 수 없으므로 도구는 안전하게 std::optional<nlohmann::json>으로 폴백합니다. 필드의 실제 타입을 알고 있다면 소스 JSON에 샘플 값(예: "field": "" 는 std::string으로 추론됨)을 제공하여 다시 생성한 다음 수동으로 std::optional<std::string>으로 변경하세요.

snake_case JSON 필드가 C++ 명명 스타일과 일치하지 않습니다

도구는 JSON 원래 필드명(예: user_name)을 유지하여 C++ 필드를 생성합니다. 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를 사용하는 것이 더 간결하고 직관적입니다; private 멤버 + 접근자 메서드를 캡슐화해야 하는 경우 수동으로 class로 변경할 수 있습니다.
std::string
C++ 표준 라이브러리의 문자열 타입(소유권 의미론)으로 <string>에 정의되어 있습니다. 이 도구는 JSON 문자열 필드를 자동으로 std::string에 매핑합니다(예: std::string name). std::string은 C 언어 char* / char[]와 다릅니다: std::string은 메모리를 자동으로 관리하고 연산자 오버로딩(+, ==, <)을 지원하지만, 작거나 중간 길이의 문자열을 처리할 때 성능이 가장 좋습니다; 매우 긴 문자열(예: 로그 전체 1KB+)은 std::string_view나 사용자 정의 버퍼를 사용하는 것이 좋습니다.
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>(#include <boost/optional.hpp>)로 대체할 수 있으며 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 라이브러리 중 하나로, 독일의 Niels Lohmann이发布했습니다. 핵심 아이디어는 JSON 데이터 구조를 C++ 표준 라이브러리 타입(예: std::map, std::vector, std::string)에 매핑하는 것이며, 역직렬화 시 j.get<T>() 한 줄로 완료할 수 있습니다. 이 도구가 생성한 코드는 nlohmann/json과 함께 사용할 수 있으며, NLOHMANN_DEFINE_TYPE_INTRUSIVE, NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE 등의 매크로를 사용하여 자동 역직렬화를 구현할 수 있습니다. 단일 헤더 의존성, 풍부한 문서, STL 스타일과 일치하는 API로 대부분의 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 등 10여 가지 언어를 지원합니다. 이 도구는 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 영역에 배치해야 합니다(매크로가 private 필드에 접근하려면). 비침습적 버전인 NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE는 클래스 외부에 배치하여 클래스 자체를 수정할 필요가 없습니다. 이 도구가 생성한 struct에는 이러한 매크로가 자동으로 추가되지 않으므로, 필요할 때 수동으로 추가하여 JSON 키와 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-like웹 백엔드, 데스크톱 애플리케이션, 교육; std::vector / std::map과 호환성이 가장 좋음
rapidjsonSAX / DOM매우 높음금융 거래, 게임 엔진, 고처리량 서비스; SIMD 가속 지원
Boost.JSONBoost.Container높음Boost 생태계 프로젝트, 웹 서버(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 to C++ 도구의 모든 작업은 귀하의 브라우저에서 완전히 로컬로 완료됩니다: JSON 파싱, C++ 구조체 생성, 파일 다운로드는 모두 브라우저 JavaScript(Web Worker + quicktype-core)를 통해 클라이언트 측에서 실행되며, 네트워크를 통해 어떤 서버에도 JSON 내용, 업로드된 파일, 또는 생성된 코드를 보내지 않습니다. 파일 업로드는 브라우저의 네이티브 FileReader API를 사용하여 메모리로 직접 읽어들이며 중간 서비스를 거치지 않습니다. Cookie 추적을 사용하지 않으며, 사용자 입력이나 사용 데이터를 수집하지 않습니다. 페이지를 닫거나 새로고침한 후 모든 입력과 출력 내용은 메모리에서 자동으로 삭제됩니다. API 키, 토큰, 민감한 비즈니스 데이터가 포함된 JSON 처리에 적합합니다.

Authoritative References