【问题标题】:JSON Apply mapping of a map to objectJSON 将映射映射到对象
【发布时间】:2019-05-27 16:58:25
【问题描述】:

我正在为模型上的更新操作编写 REST 端点。映射只是将请求的主体作为[]byte 转发到json.Unmarshal。但是,我现在正试图过滤掉 uuid 属性,使其不会在所述模型上被更改。因此,我现在不是将模型解组为 map[string]interface{},然后运行 ​​delete(m, "uuid")

此时我有一个数据映射,但我如何将它输入到json 以像通常调用UnmarshalDecode 时那样映射它?有没有比对 []byte 结果进行编组然后解组到模型上更好的选择?

【问题讨论】:

    标签: json http dictionary go struct


    【解决方案1】:

    您可以使用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
    }
    

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

    【讨论】:

    • 您好,谢谢您的回答。我已经尝试过了,但它不起作用。值得注意的是我的 UUID 字段定义为 ``` UUID uuid.UUID json:"uuid,-" ```
    • @SupaHam 你必须使用json:"-",提供一个名字也是行不通的。
    • 真的吗?这确定是设计缺陷吗?
    • @SupaHam 为什么? - 不是“选项”,它是一个特殊的名称值。
    • @SupaHam 有一个第 3 方库(请参阅编辑后的答案)完全符合您的要求,但在您提到的情况下使用它会更慢且不必要。
    猜你喜欢
    • 2012-04-23
    • 2012-07-12
    • 1970-01-01
    • 2021-07-06
    • 2017-12-24
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多