
解組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 需要是明確的外部欄位:
<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中文網其他相關文章!