作为切片数字的元帅切片结构

时间:2017-12-22 11:42:41

标签: 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]}

1 个答案:

答案 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]}