使用自訂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()
選項 2:實作 MarshalJSON( ) 在外部類型上
注意:這兩個選項都需要一些手動處理,並且可能會影響最終JSON 輸出中欄位的順序。
以上是使用自訂 MarshalJSON() 方法嵌入結構時如何正確 MarshalJSON()?的詳細內容。更多資訊請關注PHP中文網其他相關文章!