MiServe DevTools

내 스티커

도구를 여기에 고정하세요. 이 브라우저에 저장됩니다.

JSON → Go 구조체·TypeScript 변환기

JSON 샘플을 Go 구조체, TypeScript 인터페이스나 타입, JSON Schema로 바꿉니다. 선택적 키, null, 날짜도 감지합니다.

브라우저에서 실행됩니다. 붙여 넣은 내용은 업로드되지 않습니다.

이 도구에 대하여

샘플에서 추론하는 것

이 도구는 JSON 값을 순회하며 위치마다 발견한 것을 기록합니다. 배열의 요소는 하나의 설명으로 합쳐집니다. 일부 객체에 없는 키는 선택적이 되고, 때때로 null인 값은 nullable이 되며, 서로 다른 종류의 값이 섞인 배열은 TypeScript에서는 유니언, Go에서는 []any가 됩니다.

숫자는 모든 샘플이 소수점이나 지수 없이 쓰여 있고 부호 있는 64비트 정수에 들어갈 때만 정수가 되며, 그렇지 않으면 부동소수점 숫자가 됩니다. 문자열은 모든 샘플이 2026-11-14T10:00:00Z 같은 RFC 3339 날짜·시간일 때만 날짜·시간이 됩니다. 시간 없는 날짜는 문자열로 남습니다.

중첩된 객체에는 각각 키 이름을 딴 타입이 생깁니다. 배열 요소의 경우 키가 일반적인 영어 복수형이면 단수형으로 바꿔 users는 User, categories는 Category가 되고, 그렇지 않으면 Item을 덧붙입니다. 중첩 타입 인라인을 켜면 중첩된 객체가 부모 안에 직접 작성됩니다.

Go 출력

필드 이름은 공개(exported) 이름이 되며 약어에 대한 Go 관례를 따르므로 user_id는 UserID, html_url은 HTMLURL이 되고, json 태그에는 원래 키가 남습니다. 정수는 int이지만, Go 명세상 int는 32비트일 수 있으므로 32비트에 들어가지 않는 샘플이 있으면 int64가 됩니다. 그 밖의 숫자는 float64, 날짜·시간은 time.Time입니다. 1과 1.0의 구분은 중요합니다. encoding/json은 1.0을 int 필드로 디코딩하지 않습니다.

선택적 필드에 omitempty 추가를 켜면 일부 샘플에 없는 키는 태그에 omitempty가 붙고 타입은 그대로 유지됩니다. null일 수 있는 스칼라나 구조체는 null과 제로 값을 구분할 수 있도록 *string 같은 포인터가 됩니다. 슬라이스나 맵은 nil이 될 수 있으므로 포인터가 필요 없습니다. 항상 null인 값은 any가 됩니다. omitempty는 구조체 값을 절대 생략하지 않으므로, 선택적 중첩 구조체와 선택적 time.Time 필드도 포인터가 됩니다. 열은 gofmt와 같은 방식으로 정렬됩니다.

구조체 필드에 바인딩할 수 없는 키도 있습니다. 빈 키나 쉼표, 따옴표, 백슬래시가 들어 있는 키는 어떤 json 태그로도 지정할 수 없습니다. 또한 기존 encoding/json은 문자, 숫자, 일반적인 문장 부호 이외의 문자가 들어 있는 태그 이름을 무시하므로, 결합 문자나 이모지가 들어 있는 키는 encoding/json/v2 기반 구현에서만 일치합니다. 샘플에 이런 키가 있으면 출력 아래에 목록으로 표시됩니다.

TypeScript와 JSON Schema 출력

TypeScript에서 선택적 키는 ?:로, nullable 값은 | null로 쓰며, 유효한 식별자가 아닌 키는 따옴표로 감쌉니다. 날짜·시간은 JSON.parse가 반환하는 그대로 string 타입이 되고, 날짜·시간임을 알리는 주석이 붙습니다. 인터페이스와 타입 별칭은 같은 형태를 나타내므로, 코드베이스에서 쓰는 쪽을 고르세요.

JSON Schema 출력은 draft 2020-12를 따릅니다. 모든 샘플에 있는 키는 required에 나열되고, 정수는 integer가 되며, 날짜·시간에는 format: date-time이 붙고, 이름 있는 객체 타입은 $defs 아래에 두어 $ref로 참조합니다.

샘플은 문서 하나의 모습을 보여 줄 뿐, API가 보낼 수 있는 모든 것을 보여 주지는 않습니다. 결과를 믿고 쓰기 전에 선택적 필드와 nullable 필드를 API 문서와 대조해 보세요.

자주 묻는 질문

필드가 선택적이라는 것은 어떻게 판단하나요?

배열에서만 판단할 수 있습니다. 한 배열의 객체들이 모두 같은 키를 갖고 있지 않으면, 그중 하나 이상에 없는 키가 선택적이 됩니다. 객체가 하나뿐이면 판단할 근거가 없으므로 모든 키를 필수로 취급합니다.

어떤 숫자는 int이고 어떤 숫자는 float64인 이유는 무엇인가요?

숫자는 모든 샘플이 소수점이나 지수 없이 쓰여 있고 64비트 정수에 들어갈 때 정수 타입이 됩니다. Go에서는 int이며, 32비트 범위를 벗어나는 샘플이 있으면 int64입니다. 샘플 하나라도 2.5이거나 1.0으로 쓰여 있으면 Go에서는 float64, JSON Schema에서는 number가 됩니다. TypeScript에서는 모두 number입니다.

값이 null이면 어떻게 되나요?

같은 필드에 null이 아닌 샘플도 있으면 타입이 nullable이 됩니다. Go에서는 포인터가 되며, 슬라이스나 맵은 이미 nil이 될 수 있으므로 그대로입니다. TypeScript에서는 null과의 유니언, JSON Schema에서는 null도 허용하는 스키마가 됩니다. 샘플이 null뿐이면 실제 타입을 알 수 없으므로 Go에서는 any, TypeScript와 JSON Schema에서는 null이 됩니다.

JSON이 서버로 전송되나요?

아니요. 타입은 브라우저 탭의 JavaScript가 생성합니다. 이 도구는 붙여 넣은 내용으로 네트워크 요청을 보내지 않으며, 사이트의 보안 정책이 다른 호스트로 가는 요청을 차단합니다.

데이터의 다른 도구