본문으로 건너뛰기
Toova
모든 도구

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>;`가 됩니다.