在 Go 中使用匿名成员展平编组 JSON 结构
提供的代码尝试将包含匿名成员的结构转换为具有自定义“的展平 JSON 对象” _links”字段。但是,匿名成员“Anything”被视为命名字段,导致出现不需要的 JSON 结构。
了解 JSON 封送处理中的匿名成员处理
Go 的 JSON 封送器将匿名结构体字段视为其内部导出字段是外部结构体中的字段。可以通过提供带有名称的 JSON 标记来覆盖此行为,但没有明确的机制来展平匿名成员。
使用反射的解决方案
实现所需的效果扁平化,下面的解决方案利用了反射包。通过迭代结构体的字段,我们可以创建一个map[string]interface{},它保留原始对象的结构,而不引入新的字段:
<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中文网其他相关文章!