ネストされた構造体を持つ構造体が与えられ、目的は、構造体の 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 サイトの他の関連記事を参照してください。