使用 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中文网其他相关文章!