【问题标题】: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]}

【问题讨论】:

    标签: json go struct marshalling slice


    【解决方案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{
            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]}
    

    【讨论】:

    • 也许添加解组器以配合它(strconv.Atoi(string(b)) 并将其分配给r.Role
    • @EliasVanOotegem 我不想包含它,因为这不是问题所在,并且以这种方式编组 Role 会导致数据丢失(例如 Role.Id 丢失)。没有明显的方法可以仅从整数重构Role。一个可行的解决方案可能是使用角色注册表。
    • 哦,是的,您肯定会丢失 Id 值(此外,必须分发角色注册表,并且讨论这超出了范围)。我只是想指出有一个json.Unmarshaller 接口来匹配json.Marshaller
    猜你喜欢
    • 2012-02-25
    • 2017-02-19
    • 1970-01-01
    • 2021-09-04
    • 2019-05-01
    • 2012-11-10
    • 2020-02-03
    • 1970-01-01
    • 2021-08-12
    相关资源
    最近更新 更多