logo
GeekFormat

JSON을 Go로

왼쪽에 JSON을 붙여넣으면 오른쪽에 Go 프로젝트에서 바로 사용할 수 있는 struct 타입 정의가 자동으로 생성됩니다. 순수 브라우저 로컬 처리, 회원가입이나 업로드가 필요하지 않습니다.

관련 추천

JSON을 Go로: JSON을 Go의 강한 타입 struct로 변환하기

JSON to Go는 JSON 형식의 데이터를 Go 언어 struct 타입 정의로 자동 변환하는 과정입니다. JSON은 REST API, 설정 파일, 메시지 큐, 로그에서 가장 흔한 데이터 교환 형식이며 Go는 강한 타입 언어입니다. 개발 중에 JSON의 동적 구조를 struct로 매핑해야 encoding/json으로 역직렬화할 수 있습니다. 특히 중첩 객체의 경우 struct를 수동으로 작성하면 필드를 빠뜨리거나 타입을 잘못 쓰기 쉬운데, 이 도구는 반복 작업을 자동화하는 것을 목표로 합니다.

Go의 struct는 `type Name struct { ... }`로 선언하는 복합 데이터 타입입니다. 각 필드는 이름과 타입으로 구성되며, 필드 이름이 다른 패키지에서 접근 가능하려면 대문자로 시작해야 합니다. 이를 '내보낸 식별자'라고 합니다. 이 도구는 JSON 필드 이름을 PascalCase의 내보낸 필드 이름으로 자동 변환합니다. 예를 들어 `user_name`은 `UserName`으로 매핑되며 원본 키는 json 태그에 보존됩니다.

이 도구의 핵심 변환은 브라우저 내 jsonFormat Web Worker에서 수행되며 quicktype-core의 Go 렌더러를 `just-types` 및 `no-comments` 옵션으로 호출합니다. 전체 프로세스는 백엔드 서비스에 의존하지 않습니다: 입력된 JSON은 로컬에서 파싱되고 타입이 추론되며 Go 코드가 생성되어 마지막으로 오른쪽 편집기에 표시됩니다.

타입 추론은 일반적인 JSON에서 Go로의 매핑을 따릅니다: 문자열은 `string`, 불리언은 `bool`, 정수는 `int64`, 부동소수점은 `float64`, 배열은 슬라이스 `[]T`, 객체는 독립적인 struct, `null`은 `interface{}`로 매핑됩니다. 중첩 객체는 재귀적으로 처리되어 계층 구조가 명확하게 유지됩니다.

수동 작성과 비교할 때 도구가 생성한 코드는 '실행 가능한 초안'입니다. 개발자는 보통 실제 Go 프로젝트에 넣기 전에 루트 타입 이름, 패키지 이름, 필드 타입 정밀도(예: int64를 int로 변경), 포인터 타입 사용 여부만 미세 조정하면 됩니다. 한 번의 클릭 복사와 model.go 다운로드와 결합하여 연동과 모델링 단계의 반복 작업이 크게 줄어듭니다.

사용 사례

  • Go 백엔드 개발에서 REST API 응답 JSON을 struct로 변환하여 json.Unmarshal로 Gin/Echo/Fiber 핸들러의 매개변수에 직접 바인딩
  • 프론트엔드-백엔드 연동 시 Postman의 예제 응답 JSON을 가져와 Go 모델을 빠르게 생성하여 수동 필드 입력을 줄임
  • 서드파티 Webhook 콜백을 연동할 때 페이로드 JSON을 Go struct로 변환하여 필드 단위 접근과 검증을 편리하게 함
  • Viper/Consul/Nacos의 JSON 설정 파일을 Go 타입으로 변환하여 약한 타입의 map[string]interface{} 접근을 대체
  • 마이크로서비스 팀이 gRPC/HTTP 인터페이스의 요청/응답 구조를 통일하고 예제 JSON을 공유 Go 타입으로 변환
  • 테스트 엔지니어가 JSON 픽스처를 Go struct로 변환하고 testify와 함께 사용하여 어설션 기반 테스트를 수행
  • DevOps가 ELK/Fluentd가 수집한 JSON 로그 라인을 파싱하고 Go 프로그램으로 구조화된 분석을 하기 위해 struct를 생성
  • 크롤러가 JSON 데이터를 스크래핑한 후 Go struct로 변환하고 gorm/gen이나 ent로 데이터베이스 모델을 생성
  • IoT 디바이스가 보고한 JSON 원격 측정 데이터를 Go struct로 변환하여 에지 게이트웨이 프로그램에서 역직렬화와 필터링을 수행
  • Kafka/NATS/RabbitMQ에서 소비한 JSON 메시지를 Go 타입으로 변환하여 이벤트 기반 컨슈머를 구현
  • SDK 개발자가 서버 예제 응답 JSON을 Go struct로 변환하여 클라이언트 라이브러리의 types 패키지에 작성하여 사용자가 참조하도록 함
  • Swagger/OpenAPI 문서의 예제 JSON을 Go struct로 변환하여 인터페이스 문서 코드 예제로 사용
  • 학생이나 강사가 Go 강의에서 예제 JSON을 struct로 변환하여 Go의 타입 시스템과 json 태그 사용법을 시연
  • 데이터 마이그레이션 스크립트가 MySQL/PostgreSQL에서 내보낸 JSON 행을 Go struct로 변환하여 필드 매핑과 타입 검증을 수행
  • CI/CD 설정 JSON을 Go struct로 변환하여 Go로 작성된 파이프라인 도구에서 강한 타입의 설정 읽기를 편리하게 함
  • 레거시 프로젝트에서 map 기반 동적 JSON 읽기 코드를 struct 기반 강한 타입 접근으로 리팩토링

이용 방법

  1. 왼쪽 편집기에 JSON 내용을 붙여넣거나 .json/.txt 파일을 드래그 앤 드롭하여 업로드하거나 '예제'를 클릭하여 내장 데이터를 로드합니다.
  2. 약 400ms를 기다리면 도구가 자동으로 변환하여 오른쪽에 생성된 Go struct 코드를 표시합니다.
  3. JSON에 오류가 있으면 'JSON 수정' 버튼을 클릭하여 일반적인 형식 오류를 자동으로 수정한 후 생성을 계속합니다.
  4. 오른쪽 출력을 확인하고 '복사'를 클릭하여 Go 프로젝트에 붙여넣거나 '다운로드'를 클릭하여 model.go 파일로 저장합니다.

주요 기능

  • 브라우저 로컬 Go struct 생성: JSON 파싱과 Go 코드 생성이 브라우저 내에서 완료되며 원본 데이터는 서버에 업로드되지 않습니다
  • 400ms 디바운스 자동 변환: 붙여넣거나 수정한 후 수동으로 클릭할 필요 없이 오른쪽에 복사 가능한 Go 코드가 실시간으로 출력됩니다
  • 스마트 타입 추론: 문자열은 string, 불리언은 bool, 정수는 int64, 부동소수점은 float64, 배열은 슬라이스, 객체는 struct로 매핑됩니다
  • 중첩 객체 자동 확장: 재귀적으로 독립적인 struct 타입을 생성하여 JSON 계층 구조를 명확하게 유지합니다
  • json 태그 자동 생성: 필드 뒤에 `json:"원본필드명"` 태그가 자동으로 붙어 encoding/json과 바로 함께 사용할 수 있습니다
  • 한 번의 클릭으로 JSON 오류 수정: 후행 쉼표, 작은따옴표, 누락된 따옴표 등 일반적인 형식 오류를 자동으로 처리하고 수정 후 생성을 계속합니다
  • 붙여넣기/업로드/예제 세 가지 입력 지원: .json/.txt 파일을 드래그 앤 드롭하여 업로드하거나 내장 예제를 로드할 수 있습니다
  • 한 번의 클릭으로 복사 및 다운로드: 전체 Go 코드를 클립보드에 복사하거나 model.go 파일로 다운로드하여 프로젝트에 바로 넣을 수 있습니다
  • localStorage 입력 기록: 최근 입력을 자동으로 저장하여 새로고침이나 실수로 페이지를 닫은 후 빠르게 복구할 수 있습니다
  • 반응형 분할 화면 편집기: 좌우 패널 너비를 조절할 수 있어 데스크톱과 모바일 모두에서 입력과 출력을 편안하게 볼 수 있습니다

코드 예제

생성된 struct로 JSON 역직렬화

go

생성된 struct를 프로젝트에 복사한 후 encoding/json으로 API 응답을 직접 역직렬화합니다.

package main

import (
    "encoding/json"
    "fmt"
)

// 以下代码由 GeekFormat JSON 转 Go 工具生成
type User struct {
    ID      int64    `json:"id"`
    Name    string   `json:"name"`
    Tags    []string `json:"tags"`
    Address Address  `json:"address"`
}

type Address struct {
    City string `json:"city"`
}

func main() {
    data := []byte(`{
        "id": 1,
        "name": "Alice",
        "tags": ["admin", "dev"],
        "address": {"city": "Beijing"}
    }`)

    var u User
    if err := json.Unmarshal(data, &u); err != nil {
        panic(err)
    }

    fmt.Println(u.Name, u.Address.City)
}

필드가 누락될 수 있는 JSON 처리

go

API의 특정 필드가 존재하지 않을 수 있는 경우 해당 필드를 포인터 타입으로 변경하거나 omitempty 태그와 함께 사용하세요.

package main

import "encoding/json"

// 手动将字段改为指针,缺失时值为 nil
type User struct {
    ID      *int64  `json:"id,omitempty"`
    Name    *string `json:"name,omitempty"`
    Email   *string `json:"email,omitempty"`
}

func main() {
    data := []byte(`{"id": 1, "name": "Bob"}`)
    var u User
    json.Unmarshal(data, &u)
    if u.Email == nil {
        println("Email 字段缺失")
    }
}

자주 묻는 질문

JSON을 Go struct로 어떻게 변환하나요?

왼쪽 입력 상자에 JSON 내용을 붙여넣으면 도구가 400ms 이내에 자동으로 변환하여 오른쪽에 생성된 Go struct를 표시합니다. .json/.txt 파일을 드래그 앤 드롭하여 업로드하거나 '예제'를 클릭하여 내장 데이터를 로드할 수도 있습니다. 변환이 완료되면 한 번의 클릭으로 model.go 파일을 복사하거나 다운로드할 수 있습니다.

생성된 Go 코드에 json 태그가 포함되나요?

네. 이 도구는 quicktype-core를 기반으로 Go 코드를 생성하며, 기본적으로 각 struct 필드 뒤에 `json:"원본필드명"` 태그가 붙어 encoding/json의 Unmarshal/Marshal로 직렬화와 역직렬화를 바로 할 수 있습니다.

JSON 배열이 Go 슬라이스로 변환되나요?

네. JSON 배열은 요소 타입에 따라 해당 슬라이스 타입을 생성합니다. 예를 들어 `["a","b"]`는 `[]string`을, `[1,2,3]`은 `[]int64`를, `[{...},{...}]`는 `[]UserItem`과 같은 사용자 정의 타입을 생성합니다.

중첩 객체가 여러 struct를 생성하나요?

네. 각 중첩 객체는 재귀적으로 독립적인 struct 타입을 생성하며 PascalCase로 명명됩니다. 예를 들어 `address` 객체는 `Address` struct를 생성하고 주 struct에서 `Address Address` 필드로 참조합니다.

null 값은 어떤 타입을 생성하나요?

JSON의 null 값은 일반적으로 `interface{}`로 추론되며 이는 안전한 폴백 타입입니다. 해당 필드의 실제 타입을 알고 있다면 JSON에 예제 값을 추가하고 다시 생성한 후 구체적인 타입으로 수동으로 조정할 수 있습니다.

루트 struct 이름을 사용자 정의할 수 있나요?

네. 도구는 기본적으로 루트 타입 이름(예: User)을 사용합니다. 설정에서 루트 타입 이름을 수정하면 연결된 모든 하위 타입 이름이 동기화되어 업데이트되고 다운로드되는 파일 이름도 그에 따라 변경됩니다.

JSON에 형식 오류가 있으면 어떻게 하나요?

도구가 JSON 유효성을 자동으로 감지합니다. 후행 쉼표, 작은따옴표, 누락된 따옴표 등 일반적인 오류가 있으면 'JSON 수정' 버튼이 나타납니다. 클릭하면 도구가 자동 수정을 시도하고 Go struct를 다시 생성합니다. 수정에 실패하면 구체적인 오류 위치가 표시됩니다.

데이터가 서버에 업로드되나요? 프라이버시가 안전한가요?

아니요. 모든 JSON 파싱, 타입 추론, Go 코드 생성은 Web Worker를 통해 브라우저 내에서 완료됩니다. 입력한 내용과 생성된 코드는 어떤 서버에도 업로드되지 않으며 클라우드에 기록되지 않습니다. API 키, 토큰, 비즈니스 데이터가 포함된 민감한 JSON도 안심하고 사용할 수 있습니다.

생성된 코드를 Go 프로젝트에 바로 넣어 사용할 수 있나요?

네. 생성된 코드는 json 태그가 포함된 표준 Go struct로 프로젝트의 types/ 또는 models/ 디렉토리에 직접 복사하여 사용할 수 있습니다. 프로젝트 명명 규칙에 따라 타입 이름과 패키지 이름을 미세 조정하는 것을 권장합니다.

이 도구는 유료인가요? 회원가입이 필요한가요?

완전히 무료이며 회원가입이나 로그인이 필요하지 않습니다. 페이지를 열면 바로 사용할 수 있으며 기능 제한, 워터마크, 강제 로그인이 없습니다.

어느 크기의 JSON 파일을 지원하나요?

도구에 엄격한 파일 크기 제한은 없지만 변환 속도와 렌더링 성능은 브라우저와 기기 성능에 의존합니다. 최상의 경험을 위해 1MB 이내의 JSON을 처리하는 것을 권장합니다. 매우 큰 JSON은 먼저 JSON 포맷터나 분할 도구로 처리하세요.

숫자 타입이 일괄적으로 float64를 생성하나요?

아니요. 도구는 정수와 부동소수점을 구분합니다: 정수 필드는 int64를, 부동소수점 필드는 float64를 생성합니다. int, uint64 등 더 구체적인 타입을 선호하는 경우 생성 후 수동으로 교체하세요.

문제 해결

오른쪽에 'JSON 데이터를 입력해 주세요'가 표시됨

왼쪽 입력 상자가 비어 있거나 공백 문자만 있습니다. 유효한 JSON을 붙여넣거나 '예제'를 클릭하여 데이터를 로드하거나 .json/.txt 파일을 드래그 앤 드롭하세요.

JSON 파싱 실패가 표시되지만 오류 위치를 찾을 수 없음

입력 상자 아래의 'JSON 수정' 버튼을 클릭하세요. 도구가 후행 쉼표, 작은따옴표, 누락된 따옴표, JS 스타일 객체 등의 문제를 자동으로 수정하려고 시도합니다. 수정 후 수정된 결과가 하이라이트되어 표시됩니다.

생성된 필드 이름이 Go 명명 규칙을 따르지 않음

도구는 JSON 키에서 PascalCase 필드 이름을 생성합니다. 키에 한국어나 특수 문자가 포함된 경우 이스케이프된 필드 이름이 생성될 수 있습니다. JSON 키를 영문 소문자나 snake_case로 변경한 후 생성 후 일괄 조정하는 것을 권장합니다.

null 필드가 interface{}를 생성하는데 구체적인 타입으로 변경하고 싶음

null은 구체적인 타입을 추론할 수 없으므로 도구는 interface{}를 폴백으로 사용합니다. 원본 JSON에 해당 필드의 예제 값(예: "" 또는 0)을 주고 다시 생성한 후 string/int64 등 실제 타입으로 변경할 수 있습니다.

큰 JSON 변환 후 페이지가 느려짐

매우 큰 JSON과 많은 양의 struct를 브라우저에서 렌더링하면 상당한 메모리가 소모됩니다. 권장 사항: ① 예제 JSON에 핵심 필드만 유지; ② 여러 객체로 분할하여 별도로 변환; ③ 브라우저의 다른 메모리 많이 사용하는 탭을 닫으세요.

배열 요소 타입이 []interface{}로 추론됨

배열이 비어 있거나 []이거나 요소 타입이 일관되지 않을 때 도구는 interface{}를 폴백으로 사용합니다. 같은 타입의 예제 요소를 추가하거나 생성 후 []string, []int64 등 구체적인 슬라이스 타입으로 수동으로 변경할 수 있습니다.

용어집

struct
Go의 복합 데이터 타입으로 여러 필드를 하나의 타입으로 결합하는 데 사용됩니다. 이 도구가 생성하는 Go 코드의 본문은 여러 struct 정의로 구성됩니다.
slice
Go의 동적 배열 타입으로 구문은 []T입니다. 이 도구는 JSON 배열을 해당 슬라이스로 매핑합니다(예: []string, []int64, []UserItem).
json tag
Go struct 필드 뒤의 백틱 문자열로, 예를 들어 `json:"user_name"`과 같습니다. encoding/json 직렬화/역직렬화 시 필드 이름을 지정하는 데 사용됩니다. 이 도구는 이 태그를 자동으로 생성합니다.
interface{}
Go의 빈 인터페이스 타입으로 모든 값을 표현할 수 있습니다. 이 도구는 JSON null이나 타입을 결정할 수 없을 때 interface{}를 안전한 폴백으로 사용합니다.
PascalCase
각 단어가 대문자로 시작하는 명명 스타일로, 예를 들어 UserName, AddressCity와 같습니다. Go는 내보낸 필드가 대문자로 시작해야 하므로 이 도구는 JSON 필드 이름을 자동으로 PascalCase로 변환합니다.
encoding/json
Go 표준 라이브러리의 JSON 인코딩/디코딩 패키지입니다. 이 도구가 생성한 struct에 json 태그를 붙이면 json.Unmarshal과 json.Marshal을 직접 사용할 수 있습니다.
unmarshal
JSON 바이트 스트림을 Go 값으로 파싱하는 과정입니다. struct를 생성한 후 가장 흔한 사용법은 json.Unmarshal(data, &user)를 호출하는 것입니다.
omitempty
Go json 태그의 일반적인 옵션으로, 예를 들어 `json:"name,omitempty"`는 필드가 제로 값일 때 출력을 생략함을 의미합니다. 이 도구는 기본적으로 omitempty를 생성하지 않으며 생성 후 필요에 따라 수동으로 추가합니다.

JSON 타입에서 Go 타입으로의 매핑 치트 시트

이 도구는 JSON 값의 타입에 따라 해당하는 Go 타입을 자동으로 추론합니다. 일반적인 매핑은 다음과 같습니다:

JSON 값 예시생성된 Go 타입참고
"hello"string문자열 직접 매핑
true / falsebool불리언 값
42int64소수점 없는 숫자
3.14float64소수점 있는 숫자
nullinterface{}구체적인 타입을 추론할 수 없을 때 안전한 폴백
["a","b"][]string문자열 배열
[1,2,3][]int64정수 배열
[{...},{...}][]UserItem객체 배열, 요소 타입이 재귀적으로 생성됨
{"id":1}User객체는 독립적인 struct를 생성

일반적인 Go 숫자 타입 선택 권장 사항

도구는 기본적으로 int64와 float64를 사용합니다. 실제 프로젝트에서 필요에 따라 조정하세요:

시나리오권장 타입이유
일반적인 정수 ID, 카운트int64도구 기본값과 일치하며 대부분의 JSON 숫자와 호환
양수로 알려진 데이터베이스 자동 증가 PKuint64음수를 피하고 의미가 더 명확함
32비트 시스템 또는 명시적으로 작은 범위 정수int32메모리 사용량 감소
가격, 좌표, 과학 계산float64도구 기본값과 일치하며 표준 부동소수점 정밀도
정밀한 통화 계산decimal.Decimal / intfloat64는 정밀도 위험이 있으므로 shopspring/decimal 또는 센트 단위 int를 권장

Privacy & Security

이 JSON to Go 도구의 모든 처리는 귀하의 브라우저에서 완전히 로컬로 완료됩니다: JSON 파싱, 타입 추론, Go 코드 생성이 모두 Web Worker를 통해 클라이언트 측에서 실행됩니다. 입력한 JSON 내용, 업로드한 파일, 생성된 Go 코드는 어떤 서버에도 업로드되지 않으며 클라우드에 기록, 캐시, 저장되지 않습니다. 페이지를 닫거나 새로고침하면 모든 입력과 출력 내용이 메모리에서 자동으로 지워지며 localStorage는 최근 입력 기록만 유지합니다(언제든지 지울 수 있음). API 키, 토큰, 민감한 비즈니스 데이터가 포함된 JSON 처리에 적합합니다.