Struct の JSON タグを動的に変更する
Go の Struct タグは、JSON データのエンコードとデコードにおいて重要な役割を果たします。ただし、特定の基準に基づいてこれらのタグを動的に変更することが必要になる場合があります。この記事では、Go リフレクションとその他のテクニックを使用してこれを実現する解決策を検討します。
問題
次のコード スニペットを考えてみましょう:
type User struct { ID int64 `json:"id"` Name string `json:"first"` // want to change this to `json:"name"` }
私たちの目標は、構造体をマーシャリングする前に、Name フィールドの JSON タグを json:"first" から json:"name" に変更することです。 JSON.
解決策: カスタム タグでエイリアスを使用する
Go 1.8 以降では、カスタム タグでエイリアスを利用することで、不変の構造体タグの制限を克服できます。 。その方法は次のとおりです。
type User struct { ID int64 `json:"id"` Name string `json:"first"` } func (u *User) MarshalJSON() ([]byte, error) { type alias struct { ID int64 `json:"id"` Name string `json:"name"` } var a alias = alias(*u) return json.Marshal(&a) }
MarshalJSON メソッドでは、User と同じ構造を持つが、必要な JSON タグを持つエイリアス タイプを定義します。 u (元の User 構造体) をエイリアス型の変数に割り当てることで、JSON タグを効果的に変更できます。 (元のユーザーではなく) エイリアスをマーシャリングすると、結果は目的の JSON 形式に準拠します。
カスタム実装
複数のフィールドのタグを動的に変更するには、リフレクションを使用して User 構造体のフィールドを反復処理し、それに応じてタグを更新できます。カスタム実装は次のとおりです。
import ( "reflect" "strings" ) func ModifyTags(u *User) { value := reflect.ValueOf(u) for i := 0; i < value.NumField(); i++ { tag := value.Type().Field(i).Tag.Get("json") if strings.HasPrefix(tag, "custom:") { value.Type().Field(i).Tag.Set("json", strings.TrimPrefix(tag, "custom:")) } } }
ModifyTags を呼び出すことで、「custom:」プレフィックスを持つフィールドのタグを動的に変更できます。このアプローチにより、特定の基準に基づいてタグを柔軟に変更できます。
以上がGo 構造体で JSON タグを動的に変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。