JSON将地图映射到对象

时间:2018-12-31 01:08:03

标签: json http dictionary go struct

我正在为模型的Update操作编写REST端点。映射只是将请求的主体从[]byte转发到json.Unmarshal。但是,我现在正在尝试过滤掉uuid属性,以免在上述模型上发生更改。因此,我现在不对模型进行编组,而是对map[string]interface{}进行处理,然后运行delete(m, "uuid")

这时我有了数据映射,但是如何像调用jsonUnmarshal时一样将其馈送到Decode中进行映射呢?有没有比封送[]byte结果然后解组到模型更好的选择了?

1 个答案:

答案 0 :(得分:5)

您可以用json:"-"标记对象(结构)的UUID字段,以便将其从编组/解组过程中排除,例如:

type User struct {
    Name string `json:"name"`
    UUID string `json:"-"`
}

如果您确实也需要在应用程序的其他位置封送/解组UUID字段,则最简单的解决方案是在解封之前存储UUID字段,然后在封送之后将其恢复,例如:

u := getUser() // acquire your object

uuid := u.UUID // save field

err := json.Unmarshal(data, &u)
// handle error

u.UUID = uuid // restore field

将其包装在实用程序函数中,因此您可以重复使用它:

func decodeUser(u *User, data []byte) error {
    uuid := u.UUID // save field
    if err := json.Unmarshal(data, &u); err != nil {
        return err
    }
    u.UUID = uuid // restore field
    return nil
}

请注意,存在用于映射映射到struts值(例如github.com/mitchellh/mapstructure)的第3方库,但是首先解组到映射中,然后将其映射到结构中要比解组到结构值和存储中要慢得多。 /恢复单个字段。