【问题标题】:Validate struct field if it exists验证结构字段是否存在
【发布时间】:2015-07-20 03:30:58
【问题描述】:

我将一个 JSON 用户对象发布到我的 Golang 应用程序,在该应用程序中我将“req.body”解码为一个“用户”结构。

err := json.NewDecoder(req.Body).Decode(user)
//handle err if there is one

和“用户”结构:

type User struct {
    Name      string  `json:"name,omitempty"`
    Username  string  `json:"username,omitempty"`
    Email     string  `json:"email,omitempty"`
    Town      string  `json:"town,omitempty"`
    //more fields here
}

虽然我在实际验证方面不需要帮助,但我想知道如何验证用户名,只有当它作为 JSON 对象的一部分包含在内时。目前,如果不包含用户名,则 User.Username 仍将存在但为空,即 ""

如何检查“用户名”是否包含在 POSTed 对象中?

【问题讨论】:

  • 我不确定我是否理解,为什么不检查if len(user.Username) == 0 { noUsername(); }
  • 如果一个用户对象在没有username 的情况下发布,那么len(user.Username) 仍将等于0。我想有条件地验证——也就是说,我只想验证用户名是否包含在 POST 中目的。如果不清楚,请见谅!
  • 所以我需要能够区分包含值为"" 的用户名(即忘记了用户名)的用户对象和没有用户名的用户对象。

标签: go


【解决方案1】:

您可以使用指向字符串的指针:

type User struct {
    Name     string  `json:"name,omitempty"`
    Username *string `json:"username,omitempty"`
    Email    string  `json:"email,omitempty"`
    Town     string  `json:"town,omitempty"`
    //more fields here
}

func main() {
    var u, u2 User
    json.Unmarshal([]byte(`{"username":"hi"}`), &u)
    fmt.Println("username set:", u.Username != nil, *u.Username)
    json.Unmarshal([]byte(`{}`), &u2)
    fmt.Println("username set:", u2.Username != nil)
    fmt.Println("Hello, playground")
}

playground

【讨论】:

  • 有趣,我不知道可以这样。我明天早上去测试,如果一切都好,我会打勾!
  • 我已经搞定了。快速提问 - 如果我想在检查 username 是否为 nil 后检查它的长度,是否需要取消引用它?例如len(*user.Username)
  • 是的,len 函数不能将类型 *string 作为参数。 golang.org/pkg/builtin/#len
  • 这个解决方案对我不起作用。仍然给我'错误:'Gstin' 的字段验证在'gstin' 标签上失败。输入 PutBeneDto 结构 { 电子邮件 *string json:"email" validate:"email" Gstin *string json:"gstin" validate:"gstin,omitempty" }
猜你喜欢
  • 1970-01-01
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多