>  기사  >  백엔드 개발  >  JSON 데이터를 포함된 구조체가 포함된 구조체로 역마샬링할 때 Num 필드가 무시되는 이유는 무엇입니까?

JSON 데이터를 포함된 구조체가 포함된 구조체로 역마샬링할 때 Num 필드가 무시되는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-04 21:18:02181검색

Why is the Num field ignored when unmarshalling JSON data into a struct containing an embedded struct?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.