JSON → 코드

JSON 샘플을 TypeScript·Go·Rust·Python·Java·Kotlin·Swift·C# 타입 정의나 Zod 스키마로 바꾸고, 이름이 바뀐 키는 각 언어의 태그로 원래 키를 함께 남깁니다.

샘플이 여러 개라면 차례로 이어 붙이세요 — JSON Lines도 됩니다. 타입이 모든 샘플을 담도록 합쳐집니다.

JSON을 타입 코드로

JSON 샘플을 붙여넣고 대상 언어를 고르면 바로 붙여넣을 수 있는 타입 정의가 나옵니다 — 중첩 객체는 중첩 타입으로, 배열은 타입이 있는 리스트로, 필드 타입은 값에서 추론됩니다. TypeScript 인터페이스, Go 구조체(json 태그), Rust 구조체(serde), Python 데이터클래스, Java 클래스(Jackson @JsonProperty), Kotlin 데이터 클래스(kotlinx.serialization), Swift Codable 구조체, C# 클래스(System.Text.Json)를 지원하고, 타입 대신 z.infer 타입이 붙는 Zod 스키마도 만듭니다. first_name을 firstName으로 바꾸는 것처럼 키를 식별자로 고쳐야 할 때는 원래 키를 그 언어의 어노테이션이나 태그에 남기므로, 생성된 코드가 원본 JSON을 그대로 디코딩합니다. TypeScript는 이름을 바꾸는 대신 키를 따옴표로 감싸고, Python 데이터클래스에는 그런 어노테이션이 없어서 이름이 바뀐 필드는 “JSON을 읽어 들이는 코드도 추가”가 만드는 from_dict를 거쳐야만 원래 키와 이어집니다. 모든 처리는 브라우저에서 이뤄져 JSON은 업로드되지 않습니다.

옵션 아래의 상자는 모두 기본으로 꺼져 있어, 켜지 않으면 기본 출력 그대로입니다. 같은 값이 반복되는 문자열은 열거형으로는 몇 가지 문자열이 되풀이되는 필드를 각 언어의 열거형으로 만들고, ID를 키로 쓰는 객체는 맵으로는 ID를 키로 쓰는 사전을 키마다 클래스를 만드는 대신 Record<string, T>·map[string]T·Dictionary<string, T> 같은 맵 하나로 읽습니다. 날짜·UUID·URL은 전용 타입으로는 그런 문자열에 각 언어의 디코더가 채워 주는 타입(time.Time·datetime·Guid 등)을 주고, JSON을 읽어 들이는 코드도 추가는 파싱 함수를 덧붙입니다 — Go의 UnmarshalRoot, Rust의 parse_root, Java의 Jackson fromJson 같은 것입니다. 샘플 여러 개를 차례로 이어 붙이면(JSON Lines도 됩니다) 하나의 타입으로 합쳐지고, 일부 샘플에만 있는 키는 선택 항목이 됩니다. 특정 언어에만 해당하는 설정은 그 언어를 골랐을 때만 나타납니다 — TypeScript의 interface 대신 type 별칭으로·모든 속성을 readonly로·모든 속성을 선택(?)으로, Go의 모든 필드에 omitempty(구조체를 JSON으로 다시 쓸 때 제로 값인 필드, 곧 빈 문자열·false·빈 목록 같은 값은 빠집니다), Python의 읽을 때 값마다 타입 확인 (틀리면 TypeError), 그리고 선언을 그 언어가 원하는 자리에 넣어 주는 Go·Java·Kotlin의 패키지 칸과 C#의 네임스페이스 칸입니다. Zod를 고르면 위의 네 가지 대신 Zod 전용 다섯 가지가 나옵니다 — 샘플 값이 모두 맞을 때 문자열 형식(.email()·.url()·.datetime()·.uuid()) 붙이기, 종류가 섞인 배열을 z.tuple([...])로, null이 될 수 있는 필드를 .nullable()로, 정수에 .int() 붙이기(처음부터 켜져 있음), 되풀이되는 문자열을 z.enum이나 z.literal로. Rust 구조체와 열거형에는 derive가 쓰는 use serde::{Deserialize, Serialize}; 줄이 함께 붙습니다. 고른 언어는 주소에 남으므로(Go를 고르면 ?lang=go) 주소를 그대로 공유하면 그 언어로 열립니다. 코드 아래에는 타입이 이 샘플에서 추측한 것이라는 안내가 붙습니다 — Item2 같은 이름은 다른 모양이 그 이름을 먼저 차지했다는 뜻이고, 목록의 타입 이름은 단수형을 짐작한 것이며(posts → Post), 샘플에 없던 필드는 아예 들어 있지 않습니다.

자주 묻는 질문

어떤 언어를 지원하나요?

TypeScript·Go·Rust·Python(데이터클래스)·Java(Jackson)·Kotlin(kotlinx.serialization)·Swift(Codable)·C#(System.Text.Json), 그리고 z.infer 타입이 함께 붙는 Zod 스키마입니다. 언어 드롭다운에서 대상을 고르면 같은 JSON으로 어느 언어든 코드를 생성합니다.

식별자로 쓸 수 없는 JSON 키는 어떻게 되나요?

각 언어의 관례에 맞는 이름으로 바뀝니다 — first_name은 Java·Kotlin에서 firstName, C#에서 FirstName이 됩니다. 이때 원래 키를 함께 기록하므로 생성된 코드가 그대로 디코딩됩니다: Java는 Jackson의 @JsonProperty, Kotlin은 kotlinx.serialization의 @SerialName, C#은 [JsonPropertyName] 특성, Go는 json 구조체 태그, Rust는 #[serde(rename = "…")], Swift는 CodingKeys 열거형입니다. TypeScript는 키를 따옴표로 감싸 그대로 씁니다. 예약어인 키도 언어별로 처리합니다 — Java·Python은 뒤에 밑줄, Kotlin·Swift는 백틱, Rust는 raw 식별자를 씁니다.

중첩 객체와 배열도 처리하나요?

네. 중첩 객체는 중첩 타입 정의로, 배열은 타입이 있는 컬렉션으로 변환되며, 이름은 필드명과 지정한 루트 이름에서 만들어집니다.

생성된 코드로 JSON을 실제로 읽을 수도 있나요?

네 — “JSON을 읽어 들이는 코드도 추가”를 켜세요. 그러면 언어마다 파싱 단계가 붙습니다. TypeScript는 parseRoot, Go는 encoding/json을 쓰는 UnmarshalRoot, Rust는 serde를 쓰는 parse_root, Python은 데이터클래스마다 from_dict 클래스 메서드와 root_from_json, Java는 게터와 Jackson ObjectMapper를 거치는 fromJson, Kotlin은 Json.decodeFromString을 쓰는 parseRoot, Swift는 JSONDecoder를 쓰는 parseRoot, C#은 JsonSerializer를 쓰는 FromJson입니다. 기본으로 꺼져 있어 평소의 타입 정의는 그대로입니다.

패키지를 지정하거나 type 별칭, 실행 중 타입 검사를 쓸 수 있나요?

네, 그 언어에 있는 기능이라면 됩니다. Go·Java·Kotlin의 “패키지”나 C#의 “네임스페이스” 칸은 기본으로 비어 있고, 이름을 넣으면 선언을 그 언어가 원하는 자리에 넣으며 컴파일되지 않을 이름은 거부합니다. TypeScript에서 “interface 대신 type 별칭으로”를 켜면 객체마다 export type X = { … } 형태로 씁니다. Python에서 “읽을 때 값마다 타입 확인 (틀리면 TypeError)”를 켜면 읽는 코드가 함께 붙고, 필드마다 타입을 확인해 Root.age: expected int, got str처럼 틀린 자리를 밝히는 TypeError를 냅니다.

고른 언어로 열리는 링크를 공유할 수 있나요?

네. 언어는 주소에 실립니다. Go를 고르면 ?lang=go가 붙고 그 주소로 들어오면 Go로 열리며, 기본값인 TypeScript일 때는 주소에 아무것도 붙지 않습니다. 페이지가 모르는 ?lang= 값은 무시합니다. 링크에는 언어만 실리고 JSON은 실리지 않습니다.

Zod 스키마는 어떤 Zod 버전을 대상으로 하나요?

Zod 3에서 동작하는 표준 빌더 문법입니다. 샘플 값이 모두 정수이면 z.number().int()로 출력되며, “정수는 .int()로”를 끄면 z.number()가 됩니다.

Zod를 고르면 .email()이나 .uuid(), 튜플, .nullable()도 대신 써 주나요?

네 — Zod를 고른 뒤 언어 옆에 나오는 설정을 켜면 됩니다. 앞의 셋은 꺼진 채로, “정수는 .int()로”는 켜진 채로 시작하므로 바꾸기 전까지는 기본 스키마가 나옵니다. “문자열 형식 알아내기”는 그 자리의 샘플 문자열이 모두 같은 형식이고 Zod가 실제로 받아들이는 값일 때만 .email(), .url(), .datetime()(값에 시간대 오프셋이 있으면 { offset: true }), .uuid()를 붙입니다. “종류가 섞인 배열은 z.tuple([...])로”는 요소의 종류가 둘 이상인 배열을 튜플로 쓰고, 길이가 다른 튜플이 섞이면 목록으로 돌아갑니다. “null이 될 수 있는 필드는 .nullable()로”는 유니온에서 z.null()을 빼고 남은 타입 뒤에 .nullable()을 붙입니다. “정수는 .int()로”를 끄면 그냥 z.number()가 됩니다.