JSON에서 포함된 구조 역마샬링
JSON 데이터를 포함된 구조체가 포함된 구조체로 역마샬링하려고 하면 특정 문제가 발생합니다. 다음 코드를 고려하세요.
<code class="go">type Outer struct { Inner Num int } type Inner struct { Data string } func (i *Inner) UnmarshalJSON(data []byte) error { i.Data = string(data) return nil }</code>
json.Unmarshal(data, &Outer{})를 사용하면 Num 필드가 무시됩니다. 왜 이런 일이 발생하는 걸까요?
문제는 Inner를 Outer에 삽입하는 데서 비롯됩니다. JSON 라이브러리가 Outer에서 UnmarshalJSON을 호출하면 실수로 대신 Inner에서 호출됩니다. 결과적으로 func (i *Inner) UnmarshalJSON(data []byte)의 data 인수에는 전체 JSON 문자열이 포함되어 있으며 이는 Inner에 대해서만 처리됩니다.
이 문제를 해결하려면 Inner가 명시적이어야 합니다. Outer의 필드:
<code class="go">Outer struct { I Inner // make Inner an explicit field Num int `json:"Num"` }</code>
다음은 올바른 접근 방식을 보여주는 예입니다.
<code class="go">package main import ( "encoding/json" "fmt" ) type Outer struct { I Inner `json:"I"` Num int `json:"Num"` } type Inner struct { Data string `json:"data"` } func (i *Inner) UnmarshalJSON(data []byte) error { i.Data = string(data) return nil } func main() { jsonStr := `{"I": "hello", "Num": 123}` var outer Outer err := json.Unmarshal([]byte(jsonStr), &outer) if err != nil { fmt.Println(err) } fmt.Println(outer) }</code>
위 내용은 JSON 데이터를 포함된 구조체가 포함된 구조체로 역마샬링할 때 Num 필드가 무시되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!