カスタム 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"` }
Employee インスタンスのマーシャリング予期せぬものを生み出す結果:
p := Person{"Bob"} e := Employee{&p, "Sales"} output, _ := json.Marshal(e) fmt.Printf("%s\n", string(output))
出力:
{"name": "BOB"}
Employee インスタンスに設定されているにもかかわらず、jobRole フィールドがありません。
解決策:
オプション1: 埋め込み型で MarshalJSON() を使用しない
オプション 2: MarshalJSON() をアウターに実装するタイプ
注: 両方のオプションには、一部の手動処理が必要となり、最終的な JSON 出力のフィールドの順序に影響を与える可能性があります。
以上がカスタム MarshalJSON() メソッドを使用して構造体を埋め込むときに MarshalJSON() を正しく行う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。