JSON将地图的映射应用于对象

Sup*_*Ham 2 json struct dictionary http go

我正在为模型上的Update操作编写REST端点.所述映射是简单地将请求的身体的转发作为[]bytejson.Unmarshal.但是,我现在正试图过滤掉uuid所述模型上的属性.因此,而不是解组到模型我现在做给一个map[string]interface{},然后运行delete(m, "uuid").

在这一点上我有地图的数据,但我怎么能养活它放入json到其映射,因为它通常会调用时UnmarshalDecode?有没有比编组更好的选择[]byte,然后在模型上解组?

icz*_*cza 5

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

type User struct {
    Name string `json:"name"`
    UUID string `json:"-"`
}
Run Code Online (Sandbox Code Playgroud)

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

u := getUser() // acquire your object

uuid := u.UUID // save field

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

u.UUID = uuid // restore field
Run Code Online (Sandbox Code Playgroud)

将其包装在实用程序函数中,以便您可以重用它:

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
}
Run Code Online (Sandbox Code Playgroud)

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

  • @SupaHam你必须使用`json:" - "`,提供一个名字也行不通. (2认同)