将结构切片编组为数字切片
Posted
技术标签:
【中文标题】将结构切片编组为数字切片【英文标题】:Marshal slice of structs as slice of numbers 【发布时间】:2018-06-05 01:46:57 【问题描述】:我正在尝试找出将 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]
【问题讨论】:
【参考方案1】:您可以通过实现json.Marshaler
接口来实现任何自定义编组逻辑。
因此,只需在Role
上实现MarshalJSON() ([]byte, error)
方法,您可以在其中将其编组为一个简单的int
数字。
这就是它的样子:
func (r Role) MarshalJSON() ([]byte, error)
return json.Marshal(r.Role)
如您所见,Role.MarshalJSON()
仅编组Role.Role
int
字段,而不是整个struct
。
测试它:
u := User
Id: "abc",
Roles: []Role
RoleId: "a", Role: 1,
RoleId: "b", Role: 2,
RoleId: "c", Role: 3,
,
if err := json.NewEncoder(os.Stdout).Encode(u); err != nil
panic(err)
输出如您所愿(在Go Playground 上尝试):
"id":"abc","roles":[1,2,3]
【讨论】:
也许添加解组器以配合它(strconv.Atoi(string(b))
并将其分配给r.Role
)
@EliasVanOotegem 我不想包含它,因为这不是问题所在,并且以这种方式编组 Role
会导致数据丢失(例如 Role.Id
丢失)。没有明显的方法可以仅从整数重构Role
。一个可行的解决方案可能是使用角色注册表。
哦,是的,您肯定会丢失 Id 值(此外,必须分发角色注册表,并且讨论这超出了范围)。我只是想指出有一个json.Unmarshaller
接口来匹配json.Marshaller
以上是关于将结构切片编组为数字切片的主要内容,如果未能解决你的问题,请参考以下文章