我试图弄清楚在结构下面编组JSON字符串的最佳方法是什么:
type User struct {
Id string `json:"id"`
Roles []Role `json:"roles"`
}
type Role struct {
Id string `json:"-"`
Role int
}
获取JSON输出,如:{"id": "abc", "roles": [1, 2, 3]}
答案 0 :(得分:3)
您可以通过实现json.Marshaler
接口来实现任何自定义封送逻辑。
因此,只需在MarshalJSON() ([]byte, error)
上实施Role
方法,您可以将其编组为简单的int
数字。
这就是它的样子:
func (r Role) MarshalJSON() ([]byte, error) {
return json.Marshal(r.Role)
}
正如您所看到的,Role.MarshalJSON()
只会整理Role.Role
int
字段,而不是整个struct
。
测试它:
u := User{
Id: "abc",
Roles: []Role{
Role{Id: "a", Role: 1},
Role{Id: "b", Role: 2},
Role{Id: "c", Role: 3},
},
}
if err := json.NewEncoder(os.Stdout).Encode(u); err != nil {
panic(err)
}
输出正如您所期望的那样(在Go Playground上尝试):
{"id":"abc","roles":[1,2,3]}