Rust → JSON 변환기
Serialize를 derive한 Rust 구조체를 붙여넣고 깔끔한 JSON을 받으세요.
이 도구가 하는 일
구조체를 정의하고 #[derive(Serialize)]를 붙였는데, 결국 필요한 건 JSON뿐이라 serde 보일러플레이트를 쓰고 Cargo.toml에 serde_json을 추가해 cargo run까지 돌려본 경험이 있다면 — 이 도구가 바로 그 일을 대신합니다. 여기에 Rust를 붙여넣으면 cargo에 손대지 않고도 유효한 JSON이 나옵니다. 단일 구조체 리터럴, 여러 타입이 들어 있는 전체 모듈, 혹은 Vec과 Option이 깊게 중첩된 코드 — 결과는 모두 동일합니다. 모든 필드가 보존된 깔끔한 JSON 문서가 됩니다.
이 변환기는 serde가 실제로 값을 직렬화하는 방식을 그대로 따라갑니다. String과 &str는 JSON 문자열이 되고, i32, u64, f32, f64는 모두 JSON 숫자가 됩니다. bool은 true/false, Vec<T>, &[T], [T; N]은 JSON 배열, HashMap<String, V> / BTreeMap<String, V>은 JSON 객체가 됩니다. Option<T>가 None이면 JSON null이 되고, Some(value)이면 내부 타입을 그대로 직렬화합니다. 튜플은 이종 배열로 출력됩니다 — 자세한 동작은 serde.rs/data-model에 문서화되어 있습니다.
serde 어트리뷰트도 그대로 반영됩니다. #[serde(rename = "x")]는 JSON 키 이름을 바꾸고, #[serde(skip)]는 해당 필드를 제거하며, #[serde(flatten)]는 중첩된 구조체 필드를 부모 객체로 끌어올립니다. enum 타입은 기본적으로 externally-tagged 표현을 따르며, #[serde(tag = "type")]로 바꿀 수 있습니다. 여러 구조체를 한 번에 붙여넣으면 각각이 최상위 항목으로 나옵니다. Rust 표준 라이브러리와 axum/actix로 웹 서비스를 만들고 있다면, 이 출력은 통합 테스트에 그대로 넣으면 됩니다.
사용 방법
세 단계입니다. 구조체 하나든, 수십 개 타입이 든 전체 모듈이든 동작 방식은 동일합니다.
Rust 붙여넣기 (또는 샘플 불러오기)
왼쪽 에디터에 Rust를 그대로 넣어 주세요. struct, tuple struct, 배리언트가 있는 enum, 여러 타입, 중첩된 Vec/Option/HashMap — 모두 괜찮습니다. 먼저 샘플 불러오기를 눌러 현실적인 예시부터 보셔도 좋습니다.
use 문, 라이프타임, derive 어트리뷰트를 지울 필요 없습니다. Rust 문법을 그대로 두세요 — serde 어트리뷰트도 파서가 읽는 대상입니다.
변환 누르기
초록색 변환 버튼을 클릭하세요. 도구가 Rust를 읽고, 모든 구조체와 필드를 보존한 채 한 번에 JSON을 만들어 냅니다. 처리하는 동안 잠시 로딩 표시가 뜹니다.
JSON 복사
오른쪽 패널이 들여쓰기된 JSON으로 채워집니다. reqwest 테스트, axum 통합 테스트, OpenAPI 예제, curl 명령어 등에 그대로 붙여넣으세요. 재빌드는 필요 없습니다.
이럴 때 정말 유용합니다
웹 서비스 픽스처
axum이나 actix 요청 구조체가 있고 테스트나 curl 호출용 JSON이 필요할 때. 구조체를 붙여넣고 JSON을 가져다 쓰면 끝 — cargo 사이클이 필요 없습니다.
CLI 설정 템플릿
clap 기반 CLI에 Config 구조체가 있다면, 문서용으로 별도의 <code>Default</code> 구현을 짜지 않고도 사용자가 편집할 수 있는 JSON 템플릿으로 변환할 수 있습니다.
통합 테스트용 시드
유닛 테스트에 쓰던 구조체 리터럴을, 통합 테스트·모의 서버·임베디드 DB 픽스처용 JSON 시드 파일로 바꿔 보세요.
코드와 함께 움직이는 문서
README나 OpenAPI 스펙용 JSON 예제를 실제 Rust 타입에서 바로 생성해, 문서가 어긋나는 일을 막으세요.
자주 묻는 질문
Cargo.toml에 serde와 serde_json이 필요한가요?
이 도구에는 필요 없습니다 — 서버에서 실행되며 코드를 컴파일하지 않습니다. 앱에서 런타임에 쓰실 거라면, derive 기능을 포함한 serde와 serde_json 조합이 표준입니다.
#[serde(rename)], #[serde(skip)], #[serde(flatten)]을 지원하나요?
네. #[serde(rename = "x")]는 JSON 키를 바꾸고, #[serde(skip)]는 출력에서 필드를 제거하며, #[serde(flatten)]는 중첩 구조체 필드를 부모로 올려 줍니다 — serde 필드 어트리뷰트 문서와 일치합니다.
Option, Vec, HashMap은 어떻게 처리되나요?
Option<T>가 None이면 JSON null, Some(v)이면 내부 값을 직렬화합니다. Vec<T>, 슬라이스, 배열은 JSON 배열이 됩니다. HashMap<String, V>와 BTreeMap<String, V>는 JSON 객체가 되고, 문자열이 아닌 키를 쓰는 맵은 키를 문자열로 변환합니다.
배리언트가 있는 enum은요?
기본적으로 enum 배리언트는 externally-tagged 표현({ "VariantName": {...} })을 사용합니다. #[serde(tag = "type")], #[serde(untagged)], #[serde(content = "data")] 어트리뷰트를 쓰면 internally-tagged, untagged, adjacently-tagged로 바뀝니다 — 도구가 이를 읽어서 맞게 출력합니다.
입력한 코드는 저장되나요?
변환을 위해 백엔드로 전송되지만 저장하지 않습니다 — 페이로드도 로깅하지 않습니다. 민감한 코드는 붙여넣기 전에 한 번 더 확인해 주세요.
라이프타임이나 제네릭이 포함된 Rust도 되나요?
라이프타임(&'a str)은 무시됩니다 — JSON에는 해당 개념이 없습니다. 구체 타입으로 특수화된 제네릭(Vec<User>)은 잘 동작합니다. 특수화되지 않은 제네릭은 null로 나옵니다. 실제 구문으로 전개되는 매크로는 동작하지만, 여기서 보이지 않는 proc-macro 크레이트에 의존하는 매크로는 불투명한 것으로 처리됩니다.
함께 쓰면 좋은 다른 도구
Rust → JSON은 퍼즐의 한 조각입니다. 아래 도구들과 궁합이 좋습니다: