Go を使用して JSON に埋め込まれた匿名構造体を平坦化する
提供されたコードでは、MarshalHateoas 関数は次のように構造体の JSON 表現を平坦化しようとします。匿名構造体を Hateoas 構造体のメンバーとして埋め込みます。ただし、匿名メンバーのフィールドは別の名前付きフィールドとして扱われ、望ましくない JSON 出力が発生します。
この問題を解決するには、reflect パッケージを利用して埋め込み構造体のフィールドをループし、それらを手動でマップします。フラットな表現に。以下は MarshalHateoas の修正バージョンです:
<code class="go">import ( "encoding/json" "fmt" "reflect" ) // ... func MarshalHateoas(subject interface{}) ([]byte, error) { links := make(map[string]string) // Retrieve the unexported fields of the subject struct subjectValue := reflect.Indirect(reflect.ValueOf(subject)) subjectType := subjectValue.Type() // Iterate over the fields of the embedded anonymous struct for i := 0; i < subjectType.NumField(); i++ { field := subjectType.Field(i) name := subjectType.Field(i).Name jsonFieldName := field.Tag.Get("json") // Exclude fields with "-" JSON tag if jsonFieldName == "-" { continue } // Add field values to the flattened map links[jsonFieldName] = subjectValue.FieldByName(name).Interface().(string) } // Return the JSON-encoded map return json.MarshalIndent(links, "", " ") }</code>
匿名メンバーを動的に構築されたマップに置き換えることにより、MarshalHateoas 関数は JSON 出力を正しく平坦化するようになりました:
<code class="json">{ "id": 123, "name": "James Dean", "_links": { "self": "http://user/123" } }</code>
このソリューションにより、次のことが可能になります。新しいフィールドを導入したり、プラットフォーム固有またはライブラリに依存したトリックに依存したりすることなく、匿名メンバーが埋め込まれた構造体からフラット化された JSON 表現を作成します。
以上がGo で JSON に埋め込まれた匿名構造体をフラット化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。