func ExampleUnmarshal() {
data := []byte("{\"test\": \"test\", \"TEST\": \"TEST\"}")
var d struct {
LowerCase string `json:"test"`
}
err := json.Unmarshal(data, &d)
if err != nil {
log.Println(err)
}
fmt.Println(d.LowerCase)
// Output:
// test
}
위의 테스트 코드를 실행하면 결과가 어떻게 될까?
--- FAIL: ExampleUnmarshal (0.00s)
got:
TEST
want:
test
테스트는 실패한다. Unmarshal
할 때 JSON의 test
속성값이 나올 것이라고 생각했는데 아니었다. 그렇다면 struct
에 두 속성 모두 추가해주면 어떻게 될까?
func ExampleUnmarshal() {
data := []byte("{\"test\": \"test\", \"TEST\": \"TEST\"}")
var d struct {
LowerCase string `json:"test"`
UpperCase string `json:"TEST"`
}
err := json.Unmarshal(data, &d)
if err != nil {
log.Println(err)
}
fmt.Println(d.LowerCase)
fmt.Println(d.UpperCase)
// Output:
// test
// TEST
}
위의 테스트는 통과한다. 왜그럴까? golang 문서를 찾아보면 다음과 같은 글을 찾아볼 수 있다.
To unmarshal JSON into a struct, Unmarshal matches incoming object keys to the keys used by Marshal (either the struct field name or its tag), preferring an exact match but also accepting a case-insensitive match.
JSON 속성의 대소문자를 구분하지 않는다! 만약 처리하려는 JSON의 속성값이 대소문자로 구분되어있는 값이 있다면 주의깊게 처리해야 한다.
자바스크립트로 직접 만들면서 배우는 - 자료구조와 알고리즘 강의 바로 가기
실습으로 마스터하는 OAuth 2.0: 기본부터 보안 위험까지 - OAuth 2.0 강의 바로 가기
기계인간 이종립, 소프트웨어 개발의 지혜 - Git 강의 바로 가기
코드숨에서 매주 스터디를 진행하고 있습니다. 메일을 등록하시면 새로운 스터디가 시작될 때 알려드릴게요!