假设我在User结构中有一个密码字段。
type User struct{
UserName string `json:"username"`
Password string `json:"-"`
}
我的客户通过一起发布用户名和密码来注册用户。因此,如果我将JSON解码为上面的结构,它会忽略密码。这是预期的。但是我想知道在编组时是否有任何方法可以忽略字段。我查了官方文档页面但找不到任何东西。
https://golang.org/pkg/encoding/json/
我可以在结构中添加一个额外的字段,但我首先需要知道是否可以使用JSON lib。
答案 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
对该结构进行解组。值。
答案 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 字段”,所以我希望这会有所帮助。几分钟前我来到这里寻找这个答案。