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

I'm trying to figure out what is the best way to marshal to JSON string below structure:

type User struct {
    Id string    `json:"id"`
    Roles []Role `json:"roles"`
}

type Role struct {
    Id string    `json:"-"`
    Role int     
}

Get JSON output like: {"id": "abc", "roles": [1, 2, 3]}

You can implement any custom marshaling logic by implementing the json.Marshaler interface.

So simply implement the MarshalJSON() ([]byte, error) method on Role, in which you marshal it like a simple int number.

This is how it could look like:

func (r Role) MarshalJSON() ([]byte, error) {
    return json.Marshal(r.Role)
}

As you can see, Role.MarshalJSON() only marshals the Role.Role int field, and not the whole struct.

Testing it:

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)
}

Output is as you expect it (try it on the Go Playground):

{"id":"abc","roles":[1,2,3]}