Go では、encoding/json パッケージを使用して構造体を JSON にシリアル化できます。デフォルトでは、フィールド名は JSON キーとして使用されます。ただし、json タグを使用して JSON キーをカスタマイズできます。
type User struct { ID int64 `json:"id"` Name string `json:"first"` // want to change this to `json:"name"` }
上記の例では、Name フィールドの json タグは「first」に設定されています。これは、構造体を JSON にマーシャリングするときに、Name フィールドが JSON 出力で「first」として表されることを意味します。
フィールドの JSON キーを動的に変更するには、reflect パッケージを使用して、フィールドのタグを変更し、その値を変更します。ただし、JSON タグ値を直接設定する組み込みメソッドはありません。
この制限を克服する 1 つの方法は、カスタム MarshalJSON メソッドを使用することです。このメソッドを使用すると、構造体を JSON にマーシャリングする方法を制御できます。
func (u *User) MarshalJSON() ([]byte, error) { value := reflect.ValueOf(*u) // Iterate through all the fields in the struct for i := 0; i < value.NumField(); i++ { tag := value.Type().Field(i).Tag.Get("json") // If the tag is empty, use the field name as the JSON key if tag == "" { tag = value.Type().Field(i).Name } // Update the tag with the new value value.Type().Field(i).Tag.Set("json", tag) } return json.Marshal(u) }
MarshalJSON メソッドでは、最初に構造体のすべてのフィールドを反復処理します。各フィールドについて、その JSON タグを取得し、タグ変数に保存します。タグが空の場合、フィールド名を JSON キーとして使用します。
次に、Tag フィールドで Set メソッドを呼び出して、新しい JSON タグ値を設定します。
MarshalJSON をオーバーライドすることで、メソッドを使用すると、構造体のフィールドの JSON タグを動的に変更できます。これは、特定の条件に基づいて JSON 出力をカスタマイズする必要がある場合に特に便利です。
埋め込みフィールドを含む構造体のすべてのフィールドを反復処理するには、StructField 型の Embedded フィールドを使用できます。
type User struct { // ... Another Another `json:",inline"` }
上記の例では、inline タグを使用して、User 構造体に Another 構造体が埋め込まれています。これは、Another 構造体のフィールドが User 構造体のフィールドとインラインでマーシャリングされることを意味します。
埋め込みフィールドを含む User 構造体のすべてのフィールドを反復処理するには、次のコードを使用できます。
for i := 0; i < value.NumField(); i++ { if value.Type().Field(i).Anonymous { // Iterate through the embedded fields innerValue := reflect.ValueOf(value.Field(i).Interface()) for j := 0; j < innerValue.NumField(); j++ { fmt.Println(innerValue.Type().Field(j).Tag.Get("json")) } } }
以上がGo Structs で JSON タグを動的に変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。