JSON to Go 구조체 생성기

JSON에서 Go 구조체 생성

예시 시도
루트 구조체 이름:

JSON 입력

Go 출력

로컬에서 실행 · 시크릿 붙여넣기 안전
Go 구조체가 여기에 표시됩니다…

JSON to Go 변환이란?

JSON to Go 변환은 원시 JSON 데이터를 Go 표준 라이브러리의 encoding/json 패키지에서 사용할 수 있는 Go 타입 정의로 변환합니다. Go는 정적 타입 언어이므로 모든 JSON 필드에는 대응하는 구조체 필드, 올바른 타입, 그리고 직렬화 시 어떤 JSON 키와 매핑할지 알려주는 구조체 태그가 필요합니다. 크거나 깊게 중첩된 API 응답에 대해 이런 정의를 수동으로 작성하는 것은 느리고 오류가 발생하기 쉽습니다.

Go 1.0부터 정의된 encoding/json 패키지는 리플렉션을 사용해 JSON 키를 내보내진(exported) 구조체 필드와 매핑합니다. 기본적으로 대소문자를 구분하지 않지만, 명시적인 json 구조체 태그를 사용하는 것이 표준 관행입니다. 모호성을 없애고 JSON이 camelCase나 snake_case를 유지하면서 Go의 PascalCase 관례를 사용할 수 있기 때문입니다. 변환기는 이 과정을 자동화합니다: JSON을 읽고, 값에서 Go 타입을 추론하며, 올바른 태그가 포함된 구조체 정의를 출력합니다.

Go의 타입 시스템은 JSON과 깔끔하게 대응됩니다. 문자열은 string, 불리언은 bool, 정수는 int, 부동소수점은 float64가 됩니다. 중첩된 JSON 객체는 별도의 명명된 구조체가 되고, 배열은 슬라이스가 됩니다. 한 가지 차이점은 null입니다: Go에는 범용 nullable 타입이 없으므로, null 값은 보통 포인터 타입(*string, *int) 또는 interface{}'가 됩니다. 변환기는 이 모든 것을 밀리초 안에 처리합니다.

JSON to Go 변환기를 사용하는 이유

JSON에서 Go 구조체를 수동으로 정의하면 중괄호를 세고, 타입을 추측하고, API가 변경될 때마다 태그를 다시 작성해야 합니다. 변환기는 이런 번거로움을 없애줍니다.

즉시 타입 생성
JSON을 붙여넣으면 1초도 안 되어 올바른 Go 구조체 정의를 얻습니다. 필드를 직접 입력하거나, 태그를 빠뜨리거나, 정렬을 맞추느라 고생할 필요가 없습니다.
🔒
개인 정보 우선 처리
변환은 전적으로 브라우저에서 실행됩니다. JSON이 기기 밖으로 나가지 않으므로 API 키, 토큰, 사용자 데이터가 안전하게 보호됩니다.
🏷️
올바른 구조체 태그
생성된 모든 필드에는 Go 필드 이름과 원본 JSON 키를 연결하는 json 구조체 태그가 포함됩니다. 이를 통해 json.Unmarshal 시 조용한 불일치를 방지합니다.
📦
설치 또는 가입 불필요
페이지를 열고 JSON을 붙여넣기만 하면 됩니다. Go 툴체인, CLI 도구 설치, 계정 생성이 필요 없습니다.

JSON to Go 활용 사례

REST API 클라이언트 개발
서드파티 REST API의 요청 및 응답 구조체를 생성합니다. API 문서의 샘플 JSON을 붙여넣어 http.Client와 json.NewDecoder에서 바로 사용할 수 있는 타입을 얻습니다.
gRPC 게이트웨이 모델
Go 서비스가 gRPC와 REST 엔드포인트를 모두 노출할 때, JSON 페이로드와 일치하는 Go 구조체가 필요합니다. JSON 형태를 프로토버프 정의와 일치하는 구조체로 변환합니다.
DevOps 설정 파싱
JSON 설정 파일(Terraform 출력, Kubernetes 매니페스트, CI/CD 파이프라인 설정)을 커스텀 툴링과 자동화 스크립트를 위한 타입 안전한 Go 구조체로 파싱합니다.
데이터 파이프라인 처리
메시지 큐(Kafka, RabbitMQ, SQS)나 데이터 레이크의 JSON 레코드에 대한 Go 구조체를 구축합니다. 타입이 지정된 구조체는 런타임이 아닌 컴파일 시점에 스키마 변경을 감지합니다.
테스트 픽스처 설정
JSON 테스트 픽스처를 테이블 기반 테스트용 Go 구조체로 변환합니다. 타입 안전한 픽스처는 원시 map[string]interface{}} 어서션보다 테스트 실패를 진단하기 쉽게 만듭니다.
Go 타입 시스템 학습
동적 언어에서 온 학생과 개발자가 익숙한 JSON을 붙여넣어 Go가 동일한 데이터를 명시적 타입, 포인터, 구조체 태그로 어떻게 표현하는지 확인할 수 있습니다.

JSON to Go 타입 매핑

encoding/json 패키지는 JSON 값을 Go 타입에 매핑할 때 특정 규칙을 따릅니다. 아래 표는 기본 매핑과 일반적인 대안을 보여줍니다. '기본값' 열은 대부분의 생성기가 출력하는 타입입니다. '대안' 열은 대용량 ID에 int64를 사용하거나 nullable 필드에 포인터 타입을 사용하는 것처럼 요구사항에 따라 선택할 수 있는 타입을 보여줍니다.

JSON 타입예시 값기본값대안
string"hello"stringstring
number (integer)42intint64
number (float)3.14float64float64
booleantrueboolbool
nullnullinterface{}*string / *int
object{"k": "v"}structstruct
array of strings["a", "b"][]string[]string
array of objects[{"id": 1}][]Item[]Item
mixed array[1, "a"][]interface{}[]interface{}

Go JSON 구조체 태그 참조

구조체 태그는 encoding/json이 필드를 직렬화·역직렬화하는 방식을 제어합니다. json 태그가 가장 일반적이지만, 같은 필드에 다른 태그(db, yaml, xml)와 조합할 수 있습니다. 태그 문법은 필드 타입 뒤에 백틱으로 구분된 문자열입니다. 다음은 encoding/json이 지원하는 json 태그 옵션들입니다.

태그동작사용 시점
json:"name"Maps struct field to JSON key "name"Always generated
json:"name,omitempty"Omits field from output if zero valueOptional fields
json:"-"Field is never serialized or deserializedInternal fields
json:"name,string"Encodes int/bool as JSON stringString-encoded numbers

json.Unmarshal vs json.NewDecoder

Go는 JSON을 디코딩하는 두 가지 방법을 제공합니다: 바이트 슬라이스용 json.Unmarshal과 io.Reader 스트림용 json.NewDecoder. 둘 다 동일한 구조체 태그 규칙을 사용하지만, 적합한 상황이 다릅니다.

json.Unmarshal
[]byte를 받아 구조체를 채웁니다. io.ReadAll로 읽은 HTTP 응답 본문, 파일 내용, 또는 테스트 픽스처처럼 이미 메모리에 완전히 로드된 JSON에 적합합니다. JSON이 잘못된 형식이거나 타입이 일치하지 않으면 오류를 반환합니다.
json.NewDecoder
io.Reader를 감싸고 도착하는 대로 JSON 토큰을 디코딩합니다. HTTP 응답 본문을 직접 읽거나, 개행 구분 JSON(NDJSON) 로그, 또는 전체를 메모리에 로드하고 싶지 않은 대용량 파일 같은 스트리밍 소스에 적합합니다. 다중 객체 스트림에는 More()와 함께 루프에서 Decode()를 호출합니다.

코드 예제

다음 예제는 JSON에서 생성된 Go 구조체를 실제 프로그램에서 사용하는 방법과 다른 언어에서 생성하는 방법을 보여줍니다. Go 예제는 표준 라이브러리의 encoding/json을 사용합니다.

Go (json.Unmarshal)
package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	ID       int      `json:"id"`
	Name     string   `json:"name"`
	Email    string   `json:"email"`
	IsActive bool     `json:"is_active"`
	Tags     []string `json:"tags"`
}

func main() {
	data := []byte(`{"id":1,"name":"Alice","email":"alice@example.com","is_active":true,"tags":["admin","editor"]}`)

	var user User
	if err := json.Unmarshal(data, &user); err != nil {
		panic(err)
	}
	fmt.Println(user.Name)  // → Alice
	fmt.Println(user.Tags)  // → [admin editor]
}
JavaScript (fetch + type reference)
// JSON response from API — this is the shape you'd convert to Go:
const res = await fetch("https://api.example.com/users/1");
const user = await res.json();
// user → { "id": 1, "name": "Alice", "email": "alice@example.com" }

// Equivalent Go struct:
// type User struct {
//     ID    int    `json:"id"`
//     Name  string `json:"name"`
//     Email string `json:"email"`
// }
Python (generate Go structs from JSON)
import json

def json_to_go(data: dict, name: str = "Root") -> str:
    lines = [f"type {name} struct {{"]
    type_map = {str: "string", int: "int", float: "float64", bool: "bool"}

    for key, value in data.items():
        go_type = type_map.get(type(value), "interface{}")
        field = key.title().replace("_", "")  # snake_case → PascalCase
        lines.append(f'\t{field} {go_type} `json:"{key}"`')
    lines.append("}")
    return "\n".join(lines)

data = json.loads('{"user_name": "Alice", "age": 30, "verified": true}')
print(json_to_go(data))
# type Root struct {
#     UserName string `json:"user_name"`
#     Age      int    `json:"age"`
#     Verified bool   `json:"verified"`
# }
Go (json.Decoder for streams)
package main

import (
	"encoding/json"
	"fmt"
	"strings"
)

type Event struct {
	Type    string `json:"type"`
	Payload string `json:"payload"`
}

func main() {
	stream := strings.NewReader(`{"type":"click","payload":"btn-1"}
{"type":"scroll","payload":"page-2"}`)

	dec := json.NewDecoder(stream)
	for dec.More() {
		var ev Event
		if err := dec.Decode(&ev); err != nil {
			break
		}
		fmt.Printf("%s: %s\n", ev.Type, ev.Payload)
	}
	// → click: btn-1
	// → scroll: page-2
}

자주 묻는 질문

json.Unmarshal과 json.Decode의 차이는 무엇인가요?
json.Unmarshal은 완전한 JSON 문서를 담은 []byte를 받아 구조체를 채웁니다. json.NewDecoder는 io.Reader를 감싸고 JSON을 점진적으로 디코딩합니다. io.ReadAll 이후처럼 이미 JSON 전체가 메모리에 있을 때는 Unmarshal을 사용하세요. HTTP 응답 본문, 파일, 또는 전체 페이로드를 버퍼링하지 않으려는 스트리밍 소스에서 직접 읽을 때는 NewDecoder를 사용하세요.
페이로드에 없는 JSON 필드를 Go는 어떻게 처리하나요?
누락된 JSON 필드는 해당 Go 구조체 필드를 제로 값으로 남깁니다: 문자열은 "", 숫자는 0, 불리언은 false, 포인터와 슬라이스는 nil입니다. '필드 없음'과 '필드가 있지만 제로 값'을 구분해야 한다면 *int나 *string 같은 포인터 타입을 사용하세요. nil 포인터는 필드가 없었음을 의미하고, 제로 값을 가진 비-nil 포인터는 명시적으로 0이나 ""로 설정되었음을 의미합니다.
JSON에서 Go 구조체 필드가 내보내진(대문자) 상태여야 하는 이유는 무엇인가요?
encoding/json 패키지는 리플렉션을 사용해 구조체 필드에 접근하는데, Go의 리플렉션 규칙은 내보내진(대문자) 필드만 접근을 허용합니다. 소문자로 시작하는 필드는 encoding/json이 볼 수 없어 마샬링과 언마샬링 모두에서 조용히 건너뜁니다. json 구조체 태그를 사용해 내보내진 PascalCase 필드를 소문자 JSON 키에 매핑하세요.
Go에서 snake_case JSON 키를 어떻게 처리하나요?
정확한 JSON 키 이름으로 json 구조체 태그를 추가합니다. 예를 들어 JSON 필드 "user_name"은 `json:"user_name"` 태그와 함께 Go 필드 UserName으로 매핑됩니다. 생성기가 이를 자동으로 처리합니다. encoding/json에는 전역 네이밍 정책 옵션이 없으므로 각 필드에 고유한 태그를 선언해야 합니다.
null 값이 포함된 JSON을 Go로 변환할 수 있나요?
네. null JSON 값은 Go의 포인터 타입으로 매핑됩니다. 예를 들어 "age": null 필드는 Age *int `json:"age"`가 됩니다. JSON 값이 null이면 Go 포인터는 nil입니다. 값이 있으면 Go가 int를 할당하고 포인터가 이를 참조합니다. 항상 nullable인 필드에는 포인터를 사용하는 것이 Go의 관용적 접근법입니다.
JSON에 Go의 int가 처리할 수 있는 것보다 큰 수가 포함되면 어떻게 되나요?
Go의 int는 플랫폼에 따라 다릅니다(32비트 시스템에서는 32비트, 64비트 시스템에서는 64비트). JavaScript 타임스탬프나 데이터베이스 ID 같은 큰 수에는 int64를 명시적으로 사용하세요. JSON 숫자에 소수점이 있으면 float64를 사용합니다. float64 정밀도를 초과하는 수(예: 대용량 금융 값)에는 json.Number를 사용하세요. 원시 문자열 표현을 유지하며 직접 파싱할 수 있습니다.
이 도구와 JSON-to-Go-Struct의 차이는 무엇인가요?
이 도구는 encoding/json 사용 패턴에 초점을 맞춰 Go 타입 정의를 생성합니다: 올바른 구조체 태그, 적절한 타입 추론, 중첩 구조 및 배열 처리. 이 사이트의 JSON to Go Struct 도구는 구조체 스캐폴딩에 집중합니다. 두 도구 모두 유효한 Go 코드를 생성합니다. 워크플로에 맞는 것을 사용하세요. 이 페이지의 구조체 태그 참조와 타입 매핑 표는 어느 생성기를 선택하든 유용합니다.