반응형
Go의 encoding/json
패키지 쓸 때 구조체 필드에 태그 붙여서 JSON 직렬화, 역직렬화 동작 제어 가능함
기본 문법
구조체 필드에 JSON 태그 지정하는 법임
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
이렇게 하면 JSON 변환 시 {"name": "Alice", "age": 30}
같이 나옴
주요 옵션들
필드 이름 지정
json:"필드명"
: JSON 인코딩할 때 쓸 필드 이름 지정함type Person struct { FullName string `json:"name"` }
omitempty
omitempty
: 필드 값이 타입의 제로 값이면 JSON 결과에 안 들어감type Person struct { Name string `json:"name"` Age int `json:"age,omitempty"` Address string `json:"address,omitempty"` }
예를 들어
Age
가 0이거나Address
가 빈 문자열이면 해당 필드 JSON에 빠짐
- (대시 기호)
-
: 이 필드는 JSON 인코딩/디코딩 때 아예 무시됨type Person struct { Name string `json:"name"` Secret string `json:"-"` }
위 코드 보면
Secret
필드는 JSON 결과에 안 들어감
string 옵션
string
: 숫자나 불리언 같은 값을 JSON 문자열로 인코딩/디코딩 하도록 함type Number struct { Value int `json:"value,string"` }
예를 들어
Value
가 123이면 JSON에"123"
처럼 문자열로 표현됨
다중 옵션 사용
옵션은 쉼표(,)로 구분해서 여러 개 쓸 수 있음
type Person struct { Name string `json:"name,omitempty"` }
주의사항
- 대소문자: Go는 공개(Exported) 필드(대문자 시작)만 JSON 인코딩/디코딩 대상임. 비공개 필드(소문자 시작)는 태그 있어도 무시됨
- 기본 이름 변환: 태그 없으면 필드 이름 그대로 JSON 키로 쓰이는데, 첫 글자만 소문자로 바뀜
- 구조체 임베딩: 임베디드 구조체(익명 필드)는 태그 없이도 JSON에 포함됨. 필요하면 태그 써서 커스터마이징 가능함
예제
아래 예제는 위 옵션들 활용하는 예임
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"` // JSON 키 "name"
Age int `json:"age,omitempty"` // 값이 0이면 생략됨
Secret string `json:"-"` // JSON에 안 들어감
Score int `json:"score,string"` // 숫자를 문자열로 인코딩함
}
func main() {
p := Person{
Name: "Alice",
Age: 0,
Secret: "loves chocolate",
Score: 100,
}
data, err := json.Marshal(p)
if err != nil {
panic(err)
}
fmt.Println(string(data))
}
실행 결과는
{"name":"Alice","score":"100"}
Age
필드는 0이니까omitempty
옵션 때문에 생략됨Secret
필드는json:"-"
옵션 때문에 아예 포함 안 됨Score
필드는 숫자지만 JSON에서는 문자열"100"
으로 인코딩됨
이렇게 Go의 encoding/json
패키지에서 태그 옵션 써서 JSON 인코딩/디코딩 동작 세밀하게 제어할 수 있음
반응형