問題:
構造体をエンコードするにはどうすればよいですか?カスタム MarshalJSON() メソッドを持つ埋め込み構造体?期待される出力は、埋め込まれた構造体のカスタム マーシャリングを保持しながら、外部構造体のフィールドもエンコードすることです。
例:
type Person struct { Name string `json:"name"` } type Employee struct { *Person JobRole string `json:"jobRole"` }
構造体にはカスタム MarshalJSON() メソッドがあります:
func (p *Person) MarshalJSON() ([]byte, error) { return json.Marshal(struct { Name string `json:"name"` }{ Name: strings.ToUpper(p.Name), }) }
Employee インスタンスのマーシャリング
{"name": "BOB"}
解決策:
パーソンに MarshalJSON() を実装する代わりに、MarshalJSON() を実装する新しい Name タイプを作成します。次に、次の Name タイプを使用するように Person を変更します。
type Name string func (n Name) MarshalJSON() ([]byte, error) { return json.Marshal(struct { Name string `json:"name"` }{ Name: strings.ToUpper(string(n)), }) } type Person struct { Name Name `json:"name"` }
これにより、Employee フィールドを期待どおりにエンコードしながら、カスタム マーシャリング ロジックを Name フィールドに適用できるようになります。
一般的な解決策:
より一般的な解決策の場合は、外部構造体に MarshalJSON() を実装します。内部型のメソッドが外部型に昇格される一方で、外部型は結果を map[string]interface{} のような汎用構造にアンマーシャリングし、独自のフィールドを追加できます。
例:
type Person struct { Name string `json:"name"` } type Employee struct { *Person JobRole string `json:"jobRole"` } func (e *Employee) MarshalJSON() ([]byte, error) { b, err := e.Person.MarshalJSON() if err != nil { return nil, err } var m map[string]interface{} if err := json.Unmarshal(b, &m); err != nil { return nil, err } m["jobRole"] = e.JobRole return json.Marshal(m) }
以上がカスタム マーシャリングを使用して埋め込み構造体の MarshalJSON() を正しく行う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。