ホームページ >バックエンド開発 >Golang >実行時に Go 構造体の JSON タグを動的に変更するにはどうすればよいですか?

実行時に Go 構造体の JSON タグを動的に変更するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-21 15:46:10772ブラウズ

How Can I Dynamically Change JSON Tags in Go Structs at Runtime?

構造体の JSON タグを動的に変更する

問題

ネストされた構造体を持つ構造体が与えられ、目的は、構造体の JSON タグを動的に変更することです。 JSON エンコード前の構造体の特定のフィールド。目的の JSON 出力は、特定のフィールド名をオーバーライドすることです。

解決策

MarshalJSON での匿名構造体の使用

Go バージョン 1.8 以降、実行時にフィールドの JSON タグを動的に変更する手法を使用できます。これには、元の構造体の MarshalJSON メソッド内に目的のフィールド タグを持つ匿名構造体を作成することが含まれます。

func (u *User) MarshalJSON() ([]byte, error) {
    type alias struct {
        ID   int64  `json:"id"`
        Name string `json:"name"` // The modified JSON tag
        tag  string `json:"-"`
        Another
    }

    var a alias = alias(*u)
    return json.Marshal(&a)
}

ここで、エイリアス構造体には User 構造体と同じフィールドがありますが、Name フィールドには目的のフィールドが含まれています。 JSON タグ (「first」ではなく「name」)。エイリアス構造体の JSON エンコーディングを返すことで、JSON フィールド名を動的にオーバーライドできます。

すべてのフィールドの反復

埋め込み構造体を含む、構造体のすべてのフィールドを反復するには、パッケージを次のように反映します:

value := reflect.ValueOf(*u)
for i := 0; i < value.NumField(); i++ {
    tag := value.Type().Field(i).Tag.Get("json")
    field := value.Field(i)
    fmt.Println(tag, field)
}

このコードは、埋め込まれた別のフィールドを含むすべてのフィールドを反復処理します。 struct を作成し、各フィールドの JSON タグとフィールド値を出力します。

以上が実行時に Go 構造体の JSON タグを動的に変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。