我正在为模型的Update操作编写REST端点。映射只是将请求的主体从[]byte
转发到json.Unmarshal
。但是,我现在正在尝试过滤掉uuid
属性,以免在上述模型上发生更改。因此,我现在不对模型进行编组,而是对map[string]interface{}
进行处理,然后运行delete(m, "uuid")
。
这时我有了数据映射,但是如何像调用json
或Unmarshal
时一样将其馈送到Decode
中进行映射呢?有没有比封送[]byte
结果然后解组到模型更好的选择了?
答案 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方库,但是首先解组到映射中,然后将其映射到结构中要比解组到结构值和存储中要慢得多。 /恢复单个字段。