JSON에서 TypeScript, Go, Python, PHP, Rust로
개인정보 보호 설계 — 브라우저에서 모두 처리됩니다
실제 API 응답에서 정확한 타입 정의를 추론하는 작업은 5초면 끝나야 할 일이지만 어쩌다 15분을 잡아먹는 작업 중 하나입니다. 이 도구는 브라우저 내에서 JSON 샘플을 읽고 구조를 따라가며 TypeScript, Go, Python, PHP, 또는 Rust의 관용적인 타입을 생성합니다 — 선택 필드, ISO 날짜 감지, 정수 대 부동소수점의 올바른 구분 포함.
추론이 작동하는 방식
도구는 JSON 트리를 한 번 순회하며 중간 표현을 만듭니다. 원시값은 string / int / float / bool / null이 되고, 배열은 멤버의 합집합에서 원소 타입을 추론하고, 객체는 값에서 필드 타입을 가져와 구조체로 변환됩니다. 어떤 필드가 배열의 일부 요소에는 있고 다른 요소에는 없을 때, 그 필드는 선택으로 표시되어 생성된 타입이 깨지지 않고 부분 데이터를 디코딩할 수 있습니다. 소수부가 없는 숫자는 int64(Go)/int(Python)/i64(Rust)로, 소수부가 있는 숫자는 float64/float/f64로 출력됩니다. ISO 8601(`2024-03-15T10:30:00Z`)에 부합하는 문자열은 Date / time.Time / datetime / DateTimeInterface / chrono::DateTime이 됩니다.
언어별 출력 스타일
각 에미터는 대상 언어의 관례를 따릅니다. TypeScript: `?:` 구문을 사용하는 내보낸 인터페이스. Go: `json:` 태그를 가진 struct, 선택 필드는 `omitempty`가 붙은 포인터. Python: `@dataclass`, 필수 필드 먼저 그리고 `Optional[T] = None`이 마지막(데이터클래스 순서 규칙). PHP: 엄격 타입의 final 클래스와 타입 배열용 `@var list<T>` phpdoc 힌트. Rust: `#[derive(Serialize, Deserialize)]` 구조체, nullable 필드에 `Option<T>`, Rust 스네이크 케이스 이름이 JSON 키와 다를 때 `#[serde(rename)]`.
언제 사용할 것인가 (그리고 언제 안 할 것인가)
이 생성기는 작업의 처음 80%를 해결합니다: 페이로드에서 동작하는 타입 정의를 몇 초 안에 얻기. 정밀한 제약(문자열 regex, 숫자 min/max, 판별 유니온)이 필요할 때는 수작업 스키마를 대체하지 않습니다. 그런 경우, 출력을 출발점으로 두고 타입을 더 좁히세요. 선택 필드 감지는 휴리스틱 — 샘플에 있는 것을 기반으로 함 — 이므로 가능하면 다양한 샘플을 통과시키세요.
자주 묻는 질문
- 내가 붙여넣은 JSON이 브라우저를 떠납니까?
- 아닙니다. 파서, 타입 추론, 코드 생성 모두 탭 내 JavaScript에서 실행됩니다. 생성하는 동안 Network 패널을 열어보면 외부 요청은 0건입니다. 실제 토큰과 PII가 포함된 프로덕션 페이로드에도 안전합니다.
- 필드가 항상 값을 가지는데 왜 선택으로 표시되나요?
- 선택 플래그는 배열이 그 필드가 있는 객체와 없는 객체를 모두 포함할 때 설정됩니다. 단일 객체를 붙여 넣으면 어떤 것도 선택이 되지 않습니다. 동일한 객체들의 배열을 붙여 넣어도 마찬가지입니다. 플래그는 배열 내부 구조가 다를 때만 활성화됩니다.
- 정수와 부동소수점은 어떻게 구분합니까?
- JSON에는 하나의 숫자 타입만 있습니다. 도구가 각 값을 검사하여 소수부가 없으면 int(`42`, `1000`)를, 있으면 float(`3.14`, `99.0`)를 출력합니다. 배열이 둘을 섞으면 손실 디코딩을 피하기 위해 타입이 float으로 확장됩니다.
- ISO 날짜 문자열을 감지하나요?
- 네. `YYYY-MM-DD` 또는 `YYYY-MM-DDTHH:MM:SS[.sss][Z|±HH:MM]` 패턴과 일치하는 문자열은 언어의 네이티브 날짜/시간 타입(TS의 Date, Go의 time.Time, Python의 datetime, PHP의 DateTimeInterface, Rust의 chrono::DateTime)으로 출력됩니다. 다른 날짜 형식은 문자열로 유지됩니다.
- 생성된 코드를 사용하려면 무엇을 설치해야 합니까?
- TypeScript: 없음 — 순수. Go: 표준 라이브러리만(ISO 날짜가 있으면 time.Time). Python: 표준 dataclasses 모듈. PHP: 네이티브 타입. Rust: ISO 날짜가 있으면 serde + chrono 필요. 해당하는 경우 헤더/import는 출력에 포함됩니다.
- 루트가 객체 배열인 경우에도 타입을 생성할 수 있나요?
- 네. 루트 값이 객체 배열이면 도구는 요소용 구조체와 배열용 최상위 타입 별칭을 출력합니다. 예: `[{...}, {...}]`라는 JSON을 `Users`로 명명하면 TypeScript에서 `User` 인터페이스와 `type Users = User[];`가 생성되고, Rust에서는 `pub type Users = Vec<User>;`가 됩니다.