JSON→Go 구조체 변환

JSON 객체(또는 JSON 배열)를 붙여넣으면 대응하는 Go struct 정의와 json 태그를 자동으로 생성합니다.

사용 팁

  • 배열의 모든 요소가 객체인 경우, 각 요소의 키를 병합하여 하나의 struct를 생성합니다. 일부 요소에만 존재하는 키에는 자동으로 `omitempty` 태그가 붙습니다.
  • 루트 타입 이름은 기본값 "Root"에서 원하는 이름으로 바꿀 수 있습니다. 중첩된 객체의 struct 이름은 해당 속성 이름을 PascalCase로 변환해 자동으로 생성됩니다.
  • Go에는 null을 허용하는 기본 타입이 없기 때문에 JSON의 null은 `interface{}`로 출력됩니다. 더 엄격하게 다루고 싶다면 포인터 타입으로 바꾸는 것을 검토해 보세요.
  • 생성 결과는 열이 가볍게 정렬된 초안입니다. 붙여넣은 뒤 `gofmt`를 실행하면 프로젝트의 표준 스타일에 맞춰 정렬됩니다.
  • API 응답 샘플 JSON을 그대로 붙여넣으면 Go 코드에서 사용할 응답용 struct의 초안을 빠르게 얻을 수 있습니다.

자주 묻는 질문

샘플 응답을 보고 직접 struct를 작성하면 시간이 오래 걸리고, 필드 이름 변환 실수나 json 태그 누락이 발생하기 쉬우며 특히 중첩이 깊을수록 더 그렇습니다. 자동 생성을 이용하면 이러한 실수를 방지하고 구현 시간을 크게 단축할 수 있습니다.

JSON 키(snake_case 또는 camelCase)는 첫 글자가 대문자인 PascalCase로 변환되어 Go에서 외부로 노출 가능한(exported) 필드 이름이 됩니다. 원래의 JSON 키는 json 태그(`json:"원래_키"`)에 그대로 보존되므로 인코딩·디코딩에는 문제가 없습니다.

null 값은 `interface{}` 타입으로 출력됩니다. 배열의 일부 요소에만 존재하는 키에는 자동으로 `omitempty` 태그가 붙지만, Go 타입 자체는 제로 값(zero value)을 가질 뿐이므로 "값이 없음"과 "값이 0"을 구분해야 한다면 포인터 타입으로 바꾸는 것을 검토하세요.

소수점이 포함된 JSON 숫자는 `float64`로, 포함되지 않은 숫자는 `int`로 판정합니다. 다만 JSON의 숫자 표기에는 자릿수 정보만 남기 때문에, `int64`가 필요할 만큼 큰 값은 생성 후 수동으로 조정해 주세요.

Go에는 유니언 타입이 없기 때문에, 요소마다 타입이 다른 키는 `interface{}`로 대체됩니다. 실제 값의 타입은 실행 시점에 타입 단언(type assertion)으로 판별해야 합니다.
ツールくん

여담이지만 ― Go가 struct와 json 태그를 함께 쓰는 이유

Go는 정적 타입 언어이며, JSON을 다룰 때 표준 라이브러리의 `encoding/json` 패키지는 struct 필드와 json 태그 사이의 대응 관계를 참고해 인코딩·디코딩을 수행합니다. 외부 API 응답 구조를 직접 struct로 작성하는 작업은 필드가 늘어날 때마다 손이 많이 가는 반복 작업이며, 많은 Go 프로젝트에서 되풀이되어 왔습니다.

이 도구는 샘플 JSON의 구조를 분석해 대응하는 struct 정의와 json 태그를 자동으로 생성함으로써 이 반복 작업을 줄여 줍니다. 같은 분야의 유명한 도구로는 여러 언어의 타입 변환을 지원하는 quicktype이 있지만, 손에 있는 API 응답 샘플을 그대로 붙여넣어 빠르게 Go struct를 얻고 싶은 경우라면 한 가지 기능에 집중한 도구도 나름의 편리함이 있습니다.

Go에는 struct 필드를 선택적(optional)으로 만드는 언어 기능이 없기 때문에, 누락될 수 있는 JSON 필드에 대해서는 json 태그에 `omitempty`를 붙이거나 포인터 타입(`*string` 등)을 사용해 제로 값과 "값이 존재하지 않음"을 구분하는 방식이 일반적입니다. 생성된 struct는 어디까지나 구조로부터 기계적으로 추론한 결과이므로, null 허용 여부나 API의 향후 변경 가능성은 실제 명세와 대조해 수동으로 조정하는 것이 실무상의 정석입니다.