[Go 공식문서 한국어 정리] ⓪12. Go에서 JSON 다루기
[Go 공식문서 한국어 정리] ⓪12. Go에서 JSON 다루기
원문 제목: JSON and Go
작성자: Andrew Gerrand
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 1. 서론 — 이 문서가 다루는 내용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
JSON(JavaScript Object Notation)은 간단한 데이터 교환 형식입니다.
Go의 encoding/json 패키지를 사용하면 JSON 데이터를 쉽게 읽고 쓸 수 있습니다.
이 문서는 Go에서 JSON을 생성하고 소비하는 방법을 상세히 다룹니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 2. 핵심 개념
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① Marshal — Go 구조체를 JSON으로 인코딩
json.Marshal 함수는 Go 데이터 구조를 JSON 형식의 []byte로 변환합니다.
구조체의 exported 필드(대문자 시작)만 인코딩됩니다.
② Unmarshal — JSON을 Go 구조체로 디코딩
json.Unmarshal 함수는 JSON 데이터를 Go 값으로 변환합니다.
JSON 키와 구조체 필드를 태그, 이름, 대소문자 구분 없이 매칭합니다.
③ interface{}를 활용한 동적 JSON 처리
미리 구조를 모르는 JSON 데이터는 interface{}로 디코딩할 수 있습니다.
기본적으로 map[string]interface{}와 []interface{}를 사용합니다.
JSON boolean → bool, number → float64, string → string, null → nil
④ Decoder/Encoder — 스트리밍 처리
json.NewDecoder와 json.NewEncoder는 io.Reader와 io.Writer를 감싸서
JSON 스트림을 읽고 쓸 수 있게 합니다.
HTTP 연결이나 WebSocket, 파일 처리에 유용합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 3. 주요 내용 상세
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
json.Marshal은 유효한 JSON으로 표현 가능한 데이터 구조만 인코딩합니다.
JSON 객체의 키는 문자열이어야 하므로 map[string]T 형태만 인코딩 가능합니다.
채널, 복소수, 함수 타입은 인코딩할 수 없으며, 순환 구조는 무한 루프를 유발합니다.
포인터는 값으로 인코딩되며 nil이면 null이 됩니다.
Unmarshal은 대상 타입에 있는 필드만 디코딩합니다.
b := []byte(`{"Name":"Bob","Food":"Pickle"}`)
var m Message
json.Unmarshal(b, &m)
→ Name 필드만 채워지고 Food는 무시됩니다.
구조체 태그를 사용하면 JSON 키 이름을 지정할 수 있습니다.
type Message struct {
Name string `json:"name"`
Body string `json:"body"`
}
동적 JSON 처리 예시:
var f interface{}
json.Unmarshal(b, &f)
f는 map[string]interface{}가 되며,
값에 대해 타입 어설션(type assertion)과 타입 스위치(type switch)로 접근할 수 있습니다.
참조 타입 처리:
Unmarshal은 포인터, 슬라이스, 맵을 자동으로 할당합니다.
type Foo struct { Bar *Bar }
JSON에 Bar 필드가 있으면 새 Bar를 할당하고 채웁니다.
없으면 nil 포인터로 남깁니다.
이를 활용하면 여러 메시지 타입을 하나의 구조체로 처리할 수 있습니다.
type IncomingMessage struct {
Cmd *Command
Msg *Message
}
JSON에 Cmd나 Msg 중 하나만 있어도,
해당 필드가 nil인지 확인하여 메시지 타입을 구분할 수 있습니다.
Decoder는 io.Reader에서 JSON을 읽고, Encoder는 io.Writer에 JSON을 씁니다.
이를 통해 HTTP Response Body에서 직접 JSON을 스트리밍 파싱할 수 있습니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 4. 실전 활용 / 예시
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
REST API 서버 개발 시 JSON 요청/응답 처리에 json 패키지가 필수입니다.
struct 태그를 활용하면 JSON 필드명과 Go 필드명을 분리하여 관리할 수 있습니다.
Decoder를 사용하면 대용량 JSON 데이터를 메모리에 모두 로드하지 않고 처리할 수 있습니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 5. 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Go의 encoding/json 패키지는 Marshal/Unmarshal 두 함수로 대부분의 JSON 작업을 처리합니다.
구조체 태그로 필드 매핑을 제어하고, interface{}로 동적 JSON을 안전하게 다룰 수 있습니다.
Decoder/Encoder는 대용량 데이터나 네트워크 스트림 처리에 최적화되어 있습니다.
📎 출처 링크
https://go.dev/blog/json
#Go #Golang #JSON #encoding #공식문서

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30