Json 将结构的切片封送为数字切片

Json 将结构的切片封送为数字切片,json,go,struct,marshalling,slice,Json,Go,Struct,Marshalling,Slice,我试图找出在结构下面封送到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]}您可以通过实现接口来实现任何自定义封送逻辑 因此,只需在角色上实现

我试图找出在结构下面封送到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]}

您可以通过实现接口来实现任何自定义封送逻辑

因此,只需在
角色
上实现
封送JSON()([]字节,错误)
方法,在该方法中,您可以像封送一个简单的
int
数字一样封送它

这就是它的样子:

func (r Role) MarshalJSON() ([]byte, error) {
    return json.Marshal(r.Role)
}
如您所见,
Role.marshalljson()
只封送
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)
}
输出如您所期望的那样(在上尝试):


可能会添加解组器以配合它(
strconv.Atoi(string(b))
并将其分配给
r.Role
)@EliasVanOotegem我不想包含它,因为这不是问题所在,以这种方式封送
Role
会导致数据丢失(例如
Role.Id
丢失)。没有明显的方法仅从整数重建
角色
。一个可行的解决方案可能是使用角色注册中心。哦,是的,你肯定会丢失Id值(而且,角色注册中心必须是分布式的,讨论这个问题超出了范围)。我只是想指出,有一个
json.Unmarshaller
接口来匹配
json.Marshaller
{"id":"abc","roles":[1,2,3]}