JSON을 Go 구조체로 변환

다음

JSON 샘플을 붙여넣으면 encoding/json으로 깔끔하게 파싱되는 Go 구조체 정의를 얻을 수 있습니다. 필드는 내보내지고(CamelCase), 원본 JSON 키로 태그가 부여되며, 값이 null일 수 있는 경우 포인터로 승격됩니다. 중첩 객체는 각각 이름이 지정된 별도의 구조체 선언을 갖습니다.

JSON을 Go 구조체로 변환하는 방법

  1. 1

    JSON 붙여넣기

    샘플 하나면 충분합니다. 여러 개의 샘플을 사용하면 nullable 추론의 정확도가 높아집니다.

  2. 2

    이름 규칙 선택

    내보내는 필드에는 PascalCase를 쓰는 것이 Go의 관례입니다. 약어 스타일을 선택하세요(`URL` 대 `Url`, `ID` 대 `Id`).

  3. 3

    옵셔널 전략 선택

    nullable 필드에는 포인터를 사용하거나(가장 관용적) `omitempty` 태그를 사용하세요.

  4. 4

    구조체 복사

    루트 구조체 하나와 중첩 구조체들입니다. `.go` 파일에 붙여넣고 `go build`를 실행하세요.

출력 예시

다음 입력에 대해:

{ "first_name": "Alice", "age": 30, "email": null, "tags": ["admin"] }

출력:

type User struct {
    FirstName string   `json:"first_name"`
    Age       int      `json:"age"`
    Email     *string  `json:"email"`
    Tags      []string `json:"tags"`
}

타입 매핑

JSON 값 Go 타입
문자열 string
정수 int 또는 int64
숫자(소수) float64
논리값 bool
null (null이 아닌 형제가 있을 때) *T (포인터)
배열 []T
객체 이름이 지정된 구조체
혼합 배열 []interface{}

생성기가 따르는 이름 규칙

  • 약어는 대문자로 표기: idID, urlURL, api_keyAPIKey. 이는 Go의 권장 스타일 및 go vet/staticcheck 규칙에 부합합니다.
  • snake_case JSON → PascalCase 필드: first_nameFirstName.
  • 한 단어짜리 약어는 그대로 유지: IPIP로, HTTPHTTP로 유지됩니다.
  • JSON 태그: json:"first_name"는 원본 키를 그대로 유지하여 인코딩이 양방향으로 깔끔하게 처리됩니다.

옵셔널 필드: 포인터 또는 omitempty?

전략 사용 시점
포인터 (*T) “없음”과 “영값”을 구분해야 할 때
omitempty 마셜 시 영값만 건너뛰면 될 때. 언마셜 시 누락된 값에는 0이 저장됩니다
둘 다 아님 필드가 항상 존재하고 영값이 의미를 가질 때

생성기는 null로 간주되는 모든 값에 대해 기본적으로 포인터 + omitempty를 사용합니다. 의미에 맞게 조정하세요.

흔한 실수

  • 32비트 대상에서 JSON 정수가 MaxInt32를 초과하는데 int를 사용하는 경우. 큰 값이 예상되면 int64를 사용하세요.
  • 다시 마셜하면서 키 순서를 잃는 경우. encoding/json은 원본 JSON 순서가 아니라 필드 선언 순서로 키를 출력합니다. 정규화된 출력이 필요하면 직접 정렬하세요.
  • 형태가 섞인 배열. []interface{}는 타입 안전성을 잃습니다. 대신 type 판별 필드를 갖는 유니온 타입을 고려하세요.
  • 옵셔널 필드에 omitempty를 빠뜨리는 경우. 이것이 없으면 옵셔널 필드는 생략되지 않고 "foo": null로 직렬화됩니다.

자주 묻는 질문

“필드가 없음”과 “필드가 0임”을 구분해야 할 때는 포인터를 사용하세요. 영값이 정상적인 업무 값이 아닐 때("", 0, false가 항상 “이 항목을 건너뛰기”를 뜻할 때)는 omitempty를 사용하세요. 많은 팀이 하나를 정해 코드베이스 전체에 일관되게 적용합니다.

각 중첩 객체는 이름이 지정된 별도의 구조체 선언이 됩니다(예: UserAddress). 타입이 인라인으로 처리되는 것은 중첩 구조체가 아주 작고 한 번만 사용되는 경우뿐이며, 그 외에는 깔끔하고 재사용 가능한 타입이 생성됩니다.

네. idID로, urlURL로, api_keyAPIKey로 바뀝니다. 이는 go vet이 기대하는 방식이며 대부분의 Go 스타일 가이드가 권장하는 방식입니다.

생성기는 표준 json: 태그가 붙은 일반 구조체를 출력합니다. 커스텀 UnmarshalJSON 구현(예: 비 ISO 형식의 날짜)은 생성 후 직접 추가하세요.

관련 도구

이 도구는 다른 언어로도 제공됩니다