首頁  >  文章  >  後端開發  >  如何在 Go 中使用自訂 UnmarshalJSON 處理嵌入式結構?

如何在 Go 中使用自訂 UnmarshalJSON 處理嵌入式結構?

Barbara Streisand
Barbara Streisand原創
2024-11-04 14:29:02165瀏覽

How to Handle Embedded Structs with Custom UnmarshalJSON in Go?

錯誤處理:嵌入式結構的自訂解組

在Go 中,將JSON 資料解組到具有嵌入式欄位的結構時,如果嵌入式結構定義了其結構,則可能會遇到問題自己的UnmarshalJSON 方法。這是因為 JSON 函式庫呼叫嵌入結構的 UnmarshalJSON 並忽略包含結構中定義的欄位。

案例研究

考慮以下結構定義:

<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{}) 將JSON 解組到Outer 時,Inner 欄位會觸發其UnmarshalJSON 方法,消耗整個JSON 字串。這會導致 Outer 中的 Num 欄位被忽略。

解決方案:明確欄位

要解決此問題,請將嵌入的struct Inner 轉換為Outer 中的明確欄位:

<code class="go">type Outer struct {
    I Inner // make Inner an explicit field
    Num int `json:"Num"`
}</code>

透過將Inner設為明確字段,您可以確保JSON 庫將資料解組到Outer 的適當字段中,包括Num 字段。

範例

<code class="go">import (
    "encoding/json"
    "fmt"
)

type Outer struct {
    I Inner // make Inner an explicit field
    Num int `json:"Num"`
}

type Inner struct {
    Data string
}

func (i *Inner) UnmarshalJSON(data []byte) error {
    i.Data = string(data)
    return nil
}

func main() {
    data := []byte(`{"Data": "Example", "Num": 42}`)
    var outer Outer
    err := json.Unmarshal(data, &outer)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(outer.I.Data, outer.Num) // Output: Example 42
}</code>

以上是如何在 Go 中使用自訂 UnmarshalJSON 處理嵌入式結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn