将结构切片编组为数字切片

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

以上是关于将结构切片编组为数字切片的主要内容,如果未能解决你的问题,请参考以下文章

golang:将有序的数字切片转换为数字范围表示的字符串数组

2.1.4 切片

结构切片与指向结构的指针切片

Golang 入门 : 切片(slice)

Golang 入门 : 切片(slice)

Golang按名称排序切片[关闭]