JSON → Go 구조체

JSON에서 json 태그가 있는 Go 구조체를 즉시 생성. 중첩 객체, 슬라이스, 포인터 nullable 필드, omitempty 태그 지원. 무료, 브라우저에서 실행.

  • 브라우저에서 처리
  • 데이터가 브라우저 밖으로 나가지 않습니다
  • 무료 · 회원가입 불필요
비워 두면 RootObject를 사용합니다. 이름을 바꾼 뒤 Go Struct 생성 버튼을 눌러 적용하세요.
현재 JSON과 루트 이름으로 즉시 생성합니다. Ctrl/⌘+Enter로도 생성할 수 있습니다.
JSON을 중첩 객체, 배열, null이 포함된 예시로 바꾸고 현재 설정으로 즉시 생성합니다.
JSON, 출력, 상태를 지우고 루트 이름은 유지합니다. 도구 안에서 Ctrl/⌘+L을 누르면 루트 이름도 지웁니다.
주석이나 끝 쉼표가 없는 유효한 JSON을 입력하세요. 입력을 멈춘 뒤 300밀리초 후 생성합니다. JSON이 잘못되면 출력을 지우고 오류를 표시합니다.
Go 출력
현재 표시된 Go 출력 전체를 복사합니다. 출력이 비어 있으면 복사하지 않습니다.

JSON을 입력하거나 예시를 불러와 Go 코드를 생성하세요.

예시·자세한 설명·자주 묻는 질문 실제 출력이 있는 예시, 다른 도구와의 차이, 자주 묻는 질문.

타입 매핑

  • null → interface{}
  • 문자열 → string
  • 정수 → int
  • 부동소수점 → float64
  • 불리언 → bool
  • 배열 → []T
  • nullable/선택적 → 포인터 (*T)
  • 중첩 객체 → 독립적으로 명명된 struct

예시: API 응답

{
  "user": {
    "id": 42,
    "name": "Alice",
    "email": "alice@example.com",
    "is_active": true,
    "roles": ["admin", "editor"],
    "address": { "city": "New York", "country": "US", "zip_code": "10001" },
    "last_login": null
  }
}

에서 다음이 생성됩니다:

type RootObject struct {
	User User `json:"user"`
}

type User struct {
	Id int `json:"id"`
	Name string `json:"name"`
	Email string `json:"email"`
	IsActive bool `json:"is_active"`
	Roles []string `json:"roles"`
	Address Address `json:"address"`
	LastLogin interface{} `json:"last_login"`
}

type Address struct {
	City string `json:"city"`
	Country string `json:"country"`
	ZipCode string `json:"zip_code"`
}

snake_case 키는 CamelCase 필드 이름이 되고 json 태그에 원래 키가 남아 encoding/json이 양방향으로 매핑합니다. 필드가 정렬되어 있지 않으므로 gofmt(또는 저장할 때 포맷하는 편집기)로 태그를 맞추세요. 표준 라이브러리로 디코딩합니다:

var root RootObject
if err := json.Unmarshal(data, &root); err != nil {
	log.Fatal(err)
}
fmt.Println(root.User.Name) // Alice

예시: 최상위가 배열인 경우

[{"sku": "A1", "qty": 2}, {"sku": "B2", "note": "gift"}]

에서 다음이 생성됩니다:

type RootObject struct {
	Sku string `json:"sku"`
	Qty *int `json:"qty,omitempty"`
	Note *string `json:"note,omitempty"`
}

최상위가 배열이면 구조체는 요소 하나를 나타내므로 []RootObject로 디코딩합니다. 일부 요소에 없는 키는 omitempty가 붙은 포인터가 됩니다.

예시: 같은 키 이름, 소수, 숫자로 시작하는 키

{
  "order": { "id": "A-1001", "total": 19.0, "meta": { "createdBy": "alice", "source": "web" } },
  "payment": { "status": "paid", "meta": { "provider": "stripe", "fee": 0.3 } },
  "2fa": true
}

생성 결과

type RootObject struct {
	Order Order `json:"order"`
	Payment Payment `json:"payment"`
	X2fa bool `json:"2fa"`
}

type Order struct {
	Id string `json:"id"`
	Total float64 `json:"total"`
	Meta Meta `json:"meta"`
}

type Meta struct {
	CreatedBy string `json:"createdBy"`
	Source string `json:"source"`
}

type Payment struct {
	Status string `json:"status"`
	Meta PaymentMeta `json:"meta"`
}

type PaymentMeta struct {
	Provider string `json:"provider"`
	Fee float64 `json:"fee"`
}

payment.meta는 order.meta와 필드가 달라 별도 구조체가 되며, 부모 이름을 앞에 붙인 PaymentMeta가 됩니다(필드가 같으면 둘이 Meta를 함께 씀). 19.0은 소수점으로 쓰였으므로 total은 float64입니다. encoding/json은 19.0을 int 필드로 디코딩하지 않습니다. 도구는 브라우저의 JSON 원본 텍스트 접근(Chrome 114+, Firefox 135+, Safari 18.4+)으로 숫자가 쓰인 모양을 읽습니다. 지원하지 않는 브라우저에서는 19로 보여 int가 됩니다. 키 2fa는 내보내는 이름의 첫 글자로 쓸 수 없어 필드 이름은 X2fa, 태그는 2fa 그대로입니다.

생성 후 고칠 부분

  • null은 interface{}가 됩니다. API 문서를 확인한 뒤 *string, *time.Time 같은 실제 타입의 포인터로 바꾸세요.
  • .이나 지수가 없는 숫자는 int, 19.0이나 1e3은 float64가 됩니다. 같은 배열이나 키에 정수와 소수가 섞이면 float64입니다. 샘플이 우연히 정수뿐인 필드(가격 등)는 int로 남으니 확인하세요. 64비트 플랫폼에서 int는 64비트입니다.
  • []과 그 밖에 요소 타입이 섞인 배열은 []interface{}가 됩니다.
  • 필드 이름은 Go의 약어 관례에 맞게 조정되지 않습니다. id는 Id, url은 Url이 되지만 Go Code Review Comments는 ID, URL을 권장합니다. 어느 쪽이든 json 태그 덕분에 디코딩은 올바르게 동작합니다.
  • 필드 이름이 대문자로 시작하지 않는 키(2fa, 名前)는 앞에 X를 붙입니다(X2fa). 같은 필드 이름이 되는 두 키(user_id, userId)에는 번호를 붙입니다(UserId2). 빈 키와 구조체 태그에 쓸 수 없는 문자(", , 등)가 있는 키는 encoding/json이 태그로 연결할 수 없으므로 필드 대신 주석에 적습니다.
  • PaymentMeta, Meta2 같은 이름은 JSON 키에서 만들어집니다. 용도에 맞게 이름을 바꾸세요.
  • json 태그만 생성됩니다. gorm, bson, validate 태그는 직접 추가하세요.

제한 사항

  • 입력은 유효한 JSON이어야 합니다. 오류 메시지에 위치가 표시됩니다(끝 쉼표라면 Expected double-quoted property name in JSON at position 8).
  • 타입은 붙여넣은 샘플에서만 결정됩니다.

FAQ

이 도구는 무엇을 생성하나요?

json 구조체 태그가 있는 Go struct 타입 선언을 생성합니다. 중첩된 각 JSON 객체는 독립적으로 명명된 struct가 됩니다. 배열 필드는 슬라이스([]T)가 됩니다.

nullable 필드는 어떻게 처리되나요?

샘플에서 null만 나오는 키는 타입을 알 수 없어 interface{}가 됩니다. 객체 배열에서 일부 요소는 null이고 다른 요소에는 값이 있는 키는 그 타입의 포인터(*string 등)가 됩니다. 일부 요소에 없는 키는 포인터(슬라이스는 슬라이스 그대로)가 되고 json 태그에 ,omitempty가 붙습니다. null만 섞인 키에는 ,omitempty가 붙지 않습니다.

왜 포인터 타입을 쓰나요?

Go에서는 생략할 수 있거나 null일 수 있는 값을 포인터로 나타내는 것이 관용적인 방법입니다. *string은 nil(키 없음 또는 null)이 될 수 있지만 string은 그럴 수 없습니다.

어떤 json 태그가 생성되나요?

모든 필드에 원래 JSON 키를 그대로 쓴 json 태그가 붙습니다. 그래서 필드 이름을 Go의 공개 이름(대문자 시작)으로 바꿔도 스네이크 케이스나 카멜 케이스 키와 연결됩니다. 배열의 일부 요소에 없는 키에는 ,omitempty도 붙습니다. 빈 키나 큰따옴표, 쉼표처럼 구조체 태그에 쓸 수 없는 문자가 있는 키는 필드 대신 주석으로 남깁니다. 생성하는 태그는 json 태그뿐입니다.

데이터가 서버로 전송되나요?

아니요. 구조체는 브라우저 탭 안에서 생성되며, 입력한 JSON과 루트 구조체 이름을 서버로 보내거나 브라우저 저장소에 저장하지 않습니다. 입력란 편집을 마쳤을 때, Go Struct 생성을 누르거나 예시를 불러올 때 페이지의 방문 통계에 사용 이벤트(도구 이름과 generate라는 동작) 1건만 기록되며 JSON이나 코드는 포함되지 않습니다.