Go で匿名メンバーを含むマーシャルされた JSON 構造体を平坦化する
提供されたコードは、匿名メンバーを含む構造体を、カスタム " を使用して平坦化された JSON オブジェクトに変換しようとします。 _リンク」フィールド。ただし、匿名メンバー「Anything」は名前付きフィールドとして扱われ、望ましくない JSON 構造が生成されます。
JSON マーシャリングにおける匿名メンバーの処理について
Go の JSON マーシャラー匿名の構造体フィールドを、エクスポートされた内部フィールドが外部構造体のフィールドであるかのように扱います。この動作は、JSON タグに名前を指定することでオーバーライドできますが、匿名メンバーをフラット化するための明示的なメカニズムはありません。
リフレクションを使用した解決策
目的を達成するには平坦化のために、以下のソリューションはリフレクト パッケージを利用します。構造体のフィールドを反復処理することで、新しいフィールドを導入せずに元のオブジェクトの構造を保持するマップ[文字列]インターフェース{}を作成できます。
<code class="go">func MarshalHateoas(subject interface{}) ([]byte, error) { links := make(map[string]string) out := make(map[string]interface{}) subjectValue := reflect.Indirect(reflect.ValueOf(subject)) subjectType := subjectValue.Type() for i := 0; i < subjectType.NumField(); i++ { field := subjectType.Field(i) name := subjectType.Field(i).Name out[field.Tag.Get("json")] = subjectValue.FieldByName(name).Interface() } ... }</code>
使用例
次の例は、ユーザーおよびセッション構造体のフラット化された JSON 出力を示しています。
<code class="go">package main import ( "encoding/json" "fmt" "reflect" ) type User struct { Id int `json:"id"` Name string `json:"name"` } type Session struct { Id int `json:"id"` UserId int `json:"userId"` } func MarshalHateoas(subject interface{}) ([]byte, error) { ... } func main() { u := &User{123, "James Dean"} s := &Session{456, 123} json, err := MarshalHateoas(u) if err != nil { panic(err) } else { fmt.Println("User JSON:") fmt.Println(string(json)) } json, err = MarshalHateoas(s) if err != nil { panic(err) } else { fmt.Println("Session JSON:") fmt.Println(string(json)) } }</code>
JSON 出力:
User JSON: { "id": 123, "name": "James Dean", "_links": { "self": "http://user/123" } } Session JSON: { "id": 456, "userId": 123, "_links": { "self": "http://session/456" } }
以上がGo で匿名メンバーを含む JSON 構造体をフラット化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。