JSON을 C++로
아직 내용이 없습니다
무료 온라인 JSON to C++ 도구입니다. JSON을 붙여넣으면 컴파일 가능한 C++ struct / class 헤더 파일 코드가 자동 생성되며, nlohmann/json이나 rapidjson으로 API 응답을 역직렬화하는 데 적합합니다. 중첩 객체는 자동으로 독립 클래스로 분할되고, std::vector와 std::optional은 자동으로 처리되며, 순수 브라우저 로컬에서 실행됩니다.
아직 내용이 없습니다
무료 온라인 JSON to C++ 도구입니다. JSON을 붙여넣으면 컴파일 가능한 C++ struct / class 헤더 파일 코드가 자동 생성되며, nlohmann/json이나 rapidjson으로 API 응답을 역직렬화하는 데 적합합니다. 중첩 객체는 자동으로 독립 클래스로 분할되고, std::vector와 std::optional은 자동으로 처리되며, 순수 브라우저 로컬에서 실행됩니다.
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++ 구조체로 직접 컴파일하는 빠른 입구입니다.
생성된 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", "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 格式。
*/대부분의 팀은 먼저 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::optionalArduino 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 내용을 붙여넣습니다(드래그 앤 드롭이나 클릭하여 .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), 배열(1차원 또는 다차원), 중첩 객체(임의 깊이). 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 단일 헤더 의존성이 도입되어 있고(<nlohmann/json.hpp> 직접 include), 이 도구로 생성된 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)를 사용하려면 생성 후 수동으로 수정하고 NLOHMANN 매크로(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 키, 토큰, 비공개 비즈니스 필드가 포함된 민감한 JSON도 안심하고 사용할 수 있으며, 페이지를 닫으면 데이터가 삭제됩니다.
아니요. 도구는 완전히 무료이며, 회원가입, 로그인, 권한 부여가 필요 없습니다. 페이지를 열면 바로 사용할 수 있으며, 모든 기능은 브라우저 로컬에서 사용 가능하고 호출 횟수나 파일 크기 제한이 없습니다(브라우저 메모리 제약에 따름).
도구는 JSON 유효성을 자동으로 검사합니다. 오류 시 오른쪽에 빨간색 오류 메시지가 표시되고 'JSON 복구' 버튼이 제공됩니다. 클릭하면 일반적인 오류를 자동으로 복구합니다: trailing comma, 작은따옴표를 큰따옴표로 교체, 키의 누락된 따옴표 완성, 주석 제거 등. 복구 성공 후 C++ 코드 생성이 계속됩니다.
셋 다 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 / .txt 파일을 선택하거나, 예제 버튼을 클릭하여 내장 샘플(중첩된 address / tags 필드 포함)을 로드할 수도 있습니다.
일반적인 원인: 끝에 여분의 쉼표가 있거나, 작은따옴표를 큰따옴표 대신 사용했거나, 키에 따옴표가 없거나, 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(); }, 존재하지 않는 키에 직접 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 원래 필드명(예: user_name)을 유지하여 C++ 필드를 생성합니다. 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 | 중 | 웹 백엔드, 데스크톱 애플리케이션, 교육; std::vector / std::map과 호환성이 가장 좋음 |
rapidjson | SAX / DOM | 매우 높음 | 금융 거래, 게임 엔진, 고처리량 서비스; SIMD 가속 지원 |
Boost.JSON | Boost.Container | 높음 | Boost 생태계 프로젝트, 웹 서버(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 to C++ 도구의 모든 작업은 귀하의 브라우저에서 완전히 로컬로 완료됩니다: JSON 파싱, C++ 구조체 생성, 파일 다운로드는 모두 브라우저 JavaScript(Web Worker + quicktype-core)를 통해 클라이언트 측에서 실행되며, 네트워크를 통해 어떤 서버에도 JSON 내용, 업로드된 파일, 또는 생성된 코드를 보내지 않습니다. 파일 업로드는 브라우저의 네이티브 FileReader API를 사용하여 메모리로 직접 읽어들이며 중간 서비스를 거치지 않습니다. Cookie 추적을 사용하지 않으며, 사용자 입력이나 사용 데이터를 수집하지 않습니다. 페이지를 닫거나 새로고침한 후 모든 입력과 출력 내용은 메모리에서 자동으로 삭제됩니다. API 키, 토큰, 민감한 비즈니스 데이터가 포함된 JSON 처리에 적합합니다.