json2rs: JSON에서 구조체 정의를 마법 없이 생성
Source: Dev.to
I built a small CLI tool that converts JSON files into struct definitions for Rust, Python, TypeScript, Kotlin, and Java.
It’s called json2rs.
문제
JSON 파일이 있다 — API 응답일 수도 있고, 설정 스키마일 수도 있다 — 그리고 그에 대한 struct/class 정의를 작성해야 한다. 손으로 하기는 번거롭다. 기존 생성기들은 종종 너무 영리해서 추측하고, 추론하고, 거의 컴파일되는 코드를 조용히 만들어낸다.
나는 좀 다른 것을 원했다.
설계 철학
빠르게 그리고 크게 실패한다. 입력 JSON이 잘못되었거나 모호해서 나쁜 출력이 생성될 경우, 도구는 멈추고 알려준다. 조용한 실패도 없고, 컴파일은 되지만 데이터와 맞지 않는 코드도 생성되지 않는다.
똑똑하지 않다. json2rs는 두 개의 비슷한 구조가 같은 타입이어야 하는지 추론하려 하지 않는다. 선택적 필드를 추측하지 않는다. 어떤 것도 병합하지 않는다. 보이는 그대로를 생성한다.
손으로 작성한 코드처럼 읽힌다. 목표는 사용자가 직접 코드를 작성한 것처럼 보이게 하는 것이다. 요청하지 않은 추가 derive도 없고, 래퍼 타입도 없으며, 프레임워크 가정도 없다.
최소한의 설정. 설정 파일은 17줄이다. 원하는 것을 설명하기 위해 더 많은 설정이 필요하다면, 도구가 너무 많은 일을 하고 있는 것이다.
사용법
json2rs input.json
json2rs input.json -c typescript
json2rs input.json -c python
출력은 stdout으로 가며, 원하는 곳으로 파이프하면 된다.
설정
Rust 출력을 위한 전체 설정 파일은 다음과 같다:
ext = "rs"
before_struct = "#[derive(Debug, serde::Serialize, serde::Deserialize)]\npub struct "
after_struct = "}\n\n"
before_struct_name = ""
after_struct_name = " {\n"
each_attr_format = " pub $NAME: $TYPE,\n"
number = "i64"
string = "String"
boolean = "bool"
array = "Vec"
object = "$T"
null = "serde_json::Value"
optional = "Option"
file_header = "use serde_json::Value;\n\n"
file_footer = ""
indent = " "
field_separator = ""
템플릿 변수, 접두/접미 구분, 타입별 매핑을 통해 설정 파일만 바꾸면 핵심 로직을 그대로 두고 다른 언어를 타깃으로 할 수 있다. 그래서 출력이 손으로 작성한 코드처럼 보이는 것이다: “손으로 작성한” 것이 어떤 모습인지 직접 정의한다.
구현 메모
핵심은 약 400줄의 Rust 코드이며, 소량의 의존성을 활용한다:
serde_json– JSON 파싱clap– CLI 인자 처리serde– 설정 파일의 직렬화/역직렬화anyhow– 오류 처리toml– 설정 파일 파싱lazy_static– 일부 정적 초기화
비동기 런타임도 없고, 무거운 코드‑생성 프레임워크도 없으며, 의존성 범위는 의도적으로 깔끔하게 유지된다.
성능 테스트에서 json2rs는 14.5 MB JSON 파일(1,065,218줄, 중첩 깊이 11단계)을 148 ms 만에 처리해 Rust struct 정의를 생성했다. 이는 대용량 입력에서도 효율적임을 보여준다.
타입 추론은 설계상 얕게 이루어진다: JSON을 한 번 순회하면서 각 값을 가장 리터럴한 타입에 매핑하고 바로 출력한다. 히스토리틱이 필요한 엣지 케이스는 오류로 보고한다.
이것이 아닌 것
- 스키마 생성기가 아니다.
- 양방향 도구가 아니다.
- 임의로 중첩된 다형성 타입을 우아하게 처리하지 않는다 — 할 수 없다고 알려준다.
조용히 잘못된 결과를 내는 도구를 원한다면 다른 옵션을 찾아보라. 이 도구는 덜 시도하고 크게 실패한다.
출처
github.com/BlophyNova/json2rs – 이슈와 PR을 환영한다.