[Go 공식문서 한국어 정리] ①4⑤. JSON과 Go
JSON과 Go
https://go.dev/blog/json
JSON은 간단한 데이터 교환 포맷으로, 웹 백엔드와 브라우저 간 통신에 널리 사용됩니다. Go의 encoding/json 패키지를 사용하면 JSON 데이터를 쉽게 읽고 쓸 수 있습니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① 서론
json.org에서 JSON 표준을 확인할 수 있습니다. Go는 encoding/json 패키지를 제공하여 Go 프로그램에서 JSON 데이터를 읽고 쓰는 것을 간단하게 만듭니다.
② 핵심 개념
1. Marshal: Go 데이터 구조를 JSON으로 인코딩합니다.
2. Unmarshal: JSON 데이터를 Go 데이터 구조로 디코딩합니다.
3. Exported 필드: 대문자로 시작하는 필드만 JSON에 포함됩니다.
4. Struct 태그: `json:"name"` 태그로 JSON 키 이름을 지정할 수 있습니다.
5. interface{}: 임의의 JSON 데이터를 처리할 때 사용합니다.
③ 주요 내용 상세
인코딩
b, err := json.Marshal(m)
- 구조체의 exported 필드만 인코딩됩니다.
- map[string]T 형태만 지원합니다(키는 문자열).
- 채널, 복소수, 함수 타입은 인코딩할 수 없습니다.
- 순환 참조는 무한 루프를 발생시킵니다.
- 포인터는 값으로 인코딩되며 nil이면 null이 됩니다.
디코딩
err := json.Unmarshal(b, &m)
- JSON 키를 구조체 필드와 매칭합니다(태그 → 이름 → 대소문자 무시).
- 대상 타입에 없는 필드는 무시됩니다.
- unexported 필드는 영향을 받지 않습니다.
임의의 JSON 처리
var f interface{}
err := json.Unmarshal(b, &f)
- JSON 객체는 map[string]interface{}로 변환됩니다.
- JSON 배열은 []interface{}로 변환됩니다.
- 기본 타입: bool → bool, number → float64, string → string, null → nil
참조 타입의 자동 할당
Unmarshal은 nil 슬라이스, 맵, 포인터에 대해 자동으로 메모리를 할당합니다. 예를 들어 nil 슬라이스 Parents가 JSON 배열을 받으면 자동으로 슬라이스가 생성됩니다.
스트리밍 인코더/디코더
dec := json.NewDecoder(r)
enc := json.NewEncoder(w)
- io.Reader/Writer 기반으로 JSON 스트림을 처리합니다.
- HTTP 연결이나 WebSocket, 파일 처리에 유용합니다.
④ 실전 활용
- REST API의 요청/응답으로 JSON을 주고받을 때 사용합니다.
- 구조체 태그를 활용하여 JSON 필드 이름을 Go 컨벤션과 다르게 지정할 수 있습니다.
- omitempty 태그로 제로값 필드를 생략할 수 있습니다.
- 임의의 JSON 구조를 받아야 할 때 interface{}와 타입 단언을 조합합니다.
- Decoder를 사용하면 큰 JSON 파일을 메모리에 모두 로드하지 않고 처리할 수 있습니다.
⑤ 정리
Go의 encoding/json 패키지는 직관적이고 강력한 JSON 처리 기능을 제공합니다. Marshal/Unmarshal 함수로 구조체와 JSON 간 변환을 쉽게 하고, 스트리밍 API로 대용량 데이터도 효율적으로 처리할 수 있습니다. Exported 필드 규칙과 struct 태그만 기억하면 JSON 작업이 매우 간단해집니다.
#Go #Golang #JSON #Marshal #Unmarshal #Encoding #공식문서

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