首頁 >後端開發 >Golang >使用自訂 MarshalJSON() 方法嵌入結構時如何正確 MarshalJSON()?

使用自訂 MarshalJSON() 方法嵌入結構時如何正確 MarshalJSON()?

Susan Sarandon
Susan Sarandon原創
2024-12-16 07:22:10380瀏覽

How to Correctly MarshalJSON() When Embedding Structs with Custom MarshalJSON() Methods?

使用自訂MarshalJSON() 方法嵌入結構的慣用方法

使用自訂MarshalJSON() 嵌入結構

使用自訂MarshalJSON() 嵌入結構

何時使用自訂MarshalJSON()方法嵌入結構,外部結構的欄位被提升為提升類型,覆蓋嵌入結構的 MarshalJSON() 方法。這可能會在編組外部結構時導致意外結果。

問題:

type Person struct {
    Name string `json:"name"`
}

func (p *Person) MarshalJSON() ([]byte, error) {
    return json.Marshal(struct {
        Name string `json:"name"`
    }{
        Name: strings.ToUpper(p.Name),
    })
}

type Employee struct {
    *Person
    JobRole string `json:"jobRole"`
}
考慮以下結構:

p := Person{"Bob"}
e := Employee{&p, "Sales"}
output, _ := json.Marshal(e)
fmt.Printf("%s\n", string(output))
編組 Employee實例產生意想不到的結果:

輸出:
{"name": "BOB"}

儘管在 Employee 實例上設置了 jobRole 字段,但仍丟失。

解:

選項1:避免在嵌入類型上使用MarshalJSON()
  • 從Person結構中刪除MarshalJSON() 方法。
  • 相反,建立一個單獨的類型(例如,Name)實作 MarshalJSON()。
  • 更新 Person 結構以使用新類型(例如, Person{Name: Name{"Bob"}})。
Employee 結構將從 Name 型別繼承自訂 JSON 編碼。

選項 2:實作 MarshalJSON( ) 在外部類型上
  • 在 Employee 上實作 MarshalJSON() 方法struct。
  • 呼叫嵌入的 Person 實例的 MarshalJSON() 方法來取得其 JSON 表示。
  • 將 Person 的 JSON 解組為中間表示(例如,map[string]interface{})。
將外部結構體的欄位加入中間表示並將其編組到JSON.

注意:這兩個選項都需要一些手動處理,並且可能會影響最終JSON 輸出中欄位的順序。

以上是使用自訂 MarshalJSON() 方法嵌入結構時如何正確 MarshalJSON()?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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