ホームページ > バックエンド開発 > Golang > カスタム マーシャリングを使用して埋め込み構造体の MarshalJSON() を正しく行う方法

カスタム マーシャリングを使用して埋め込み構造体の MarshalJSON() を正しく行う方法

Linda Hamilton
リリース: 2024-12-07 10:40:16
オリジナル
807 人が閲覧しました

How to Correctly MarshalJSON() for Embedded Structs with Custom Marshaling?

カスタム MarshalJSON() メソッドを使用して構造体を埋め込む慣用的な方法

問題:

構造体をエンコードするにはどうすればよいですか?カスタム 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート