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