JSON 인코딩과 디코딩
Marshal, Unmarshal 및 구조체 태그
JSON 인코딩과 디코딩은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
encoding/json 개요
Go의 encoding/json 패키지는 구조체 태그와 리플렉션을 사용하여 Go 값을 JSON으로 마샬링하고 JSON을 다시 Go 값으로 언마샬링합니다.
json.Marshal
json.Marshal은 Go 값을 JSON 바이트로 변환합니다. 지원되지 않는 타입(채널, 함수, 복소수)에 대해서는 오류를 반환합니다.
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
u := User{Name: "Alice", Age: 30}
data, err := json.Marshal(u)
fmt.Println(string(data)) // {"name":"Alice","age":30}json.Unmarshal
json.Unmarshal은 JSON을 Go 값으로 디코딩합니다. 대상은 포인터여야 합니다.
var u User
err := json.Unmarshal(data, &u)
fmt.Println(u.Name) // "Alice"구조체 태그
필드 이름을 제어하고, 비어 있는 값을 생략하며, 내보내지 않은 필드를 건너뛰려면 json: 구조체 태그를 사용하십시오.
type Product struct {
ID int `json:"id"`
Price float64 `json:"price,omitempty"` // omit if zero
secret string // unexported: ignored
}json.Encoder / json.Decoder
스트리밍(HTTP 응답 및 요청 본문)에는 전체 페이로드를 메모리에 로드하지 않도록 Marshal/Unmarshal 대신 Encoder와 Decoder를 사용하십시오.
// Writing
json.NewEncoder(w).Encode(user)
// Reading
var u User
json.NewDecoder(r.Body).Decode(&u)map[string]any로 디코딩하기
알 수 없는 JSON을 일반 맵으로 디코딩하십시오:
var m map[string]any
json.Unmarshal(data, &m)
fmt.Println(m["name"])json.Number
기본적으로 일반 맵의 숫자는 float64로 디코딩됩니다. 정밀도를 보존하면서 json.Number로 디코딩하려면 decoder.UseNumber()를 사용하십시오.
dec := json.NewDecoder(r)
dec.UseNumber()
var m map[string]any
dec.Decode(&m)사용자 지정 마샬링
타입의 인코딩 및 디코딩을 제어하려면 json.Marshaler 또는 json.Unmarshaler를 구현하십시오. 예를 들어 사용자 지정 날짜 형식에 사용할 수 있습니다.
func (d Date) MarshalJSON() ([]byte, error) {
return json.Marshal(d.Format("2006-01-02"))
}필드 생략하기
제로 값을 건너뛰려면 omitempty를 사용하십시오. 값과 관계없이 JSON 출력에서 필드를 항상 제외하려면 json:"-"를 사용하십시오.
Hidden string `json:"-"`null 처리
JSON null은 스칼라의 Go 제로 값으로 언마샬링되거나 포인터를 nil로 설정합니다. nil 포인터는 null로 마샬링됩니다.
보기 좋게 출력하기
사람이 읽기 쉬운 출력에는 json.MarshalIndent를 사용하십시오:
data, _ := json.MarshalIndent(u, "", " ")빠른 확인
구조체 태그 `json:"name,omitempty"`는 무엇을 합니까?
복습: JSON 인코딩과 디코딩
핵심 내용:
- 메모리 내 데이터에는 json.Marshal/Unmarshal을, 스트림에는 Encoder/Decoder를 사용합니다
- 구조체 태그로 이름, omitempty 및 제외 여부를 제어합니다
- 사용자 지정 타입은 Marshaler/Unmarshaler를 구현합니다
- 디버그 출력에는 json.MarshalIndent를 사용합니다
자주 묻는 질문
“JSON 인코딩과 디코딩” 강의는 무료인가요?
네 — “JSON 인코딩과 디코딩” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“JSON 인코딩과 디코딩”에서 뭘 배우나요?
Marshal, Unmarshal 및 구조체 태그 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“JSON 인코딩과 디코딩” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- os와 bufio로 파일 읽기
- 파일과 임시 파일 쓰기
- JSON 인코딩과 디코딩
- JSON과 CSV 스트리밍