当编组而不是解组时,Golang会忽略Json字段

时间:2017-11-13 02:16:02

标签: json go

假设我在User结构中有一个密码字段。

type User struct{
   UserName string `json:"username"`
   Password string `json:"-"`
}

我的客户通过一起发布用户名和密码来注册用户。因此,如果我将JSON解码为上面的结构,它会忽略密码。这是预期的。但是我想知道在编组时是否有任何方法可以忽略字段。我查了官方文档页面但找不到任何东西。

https://golang.org/pkg/encoding/json/

我可以在结构中添加一个额外的字段,但我首先需要知道是否可以使用JSON lib。

4 个答案:

答案 0 :(得分:10)

一种常见的方法是使用具有相同结构但不同json标签或甚至不同结构的临时类型或变量:

type User struct {
    UserName string `json:"username"`
    Password string `json:"password"`
}

func (usr User) MarshalJSON() ([]byte, error) {
    var tmp struct {
        UserName string `json:"username"`
    }
    tmp.UserName = usr.UserName
    return json.Marshal(&tmp)
}

答案 1 :(得分:7)

与Go中的任何自定义编组/解组要求一样,您最好的选择是在自定义类型上实现json.Unmarshaler / // Use an explicit password type. type password string type User struct{ UserName string `json:"username"` Password password `json:"password"` } // Marshaler ignores the field value completely. func (password) MarshalJSON() ([]byte, error) { return []byte(`""`), nil } 接口。

在这种情况下,您可以为密码字段执行此操作:

json.Unmarshaler

请注意,通过不实现password,类型string会保留其基础类型(Password)的默认行为,这允许使用self.view = mapView对该结构进行解组。值。

工作示例:https://play.golang.org/p/HZQoCKm0vN

答案 2 :(得分:2)

我更喜欢打字。例如:

type User struct {
    UserName string `json:"username"`
}

type UserWithPassword struct {
    *User
    Password string `json:"password"`
}

在接收数据(例如,用户创建/修改)时使用UserWithPassword,在返回数据(认证)时使用User。

答案 3 :(得分:1)

如果您想知道如何在BOTH编组解组时忽略JSON字段:

    Ulimit struct {
        Soft uint64 `json:"-"`    // this attribute will be ignored
        Hard uint64 `json:"hard"`
    } `json:"ulimit"`

PS:我知道这并不能回答这个确切的问题,但谷歌搜索查询将开发人员带到这里“如何忽略 Go 中的 JSON 字段”,所以我希望这会有所帮助。几分钟前我来到这里寻找这个答案。