登录
首页 >  Golang >  Go问答

使用可选的 JSON 参数在 Go 中的应用方法

来源:stackoverflow

时间:2024-02-05 09:23:19 480浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《使用可选的 JSON 参数在 Go 中的应用方法》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

您好,我正在 Go 中开发 Rest API,我希望用户传递 JSON 参数:

Offset int64  `json:"offset"`
Limit  int64  `json:"limit"`
SortBy string `json:"sortby"`
Asc    bool   `json:"asc"`
Username   string `json:"username"`
First_Name string `json:"first_name"`
Last_Name  string `json:"last_name"`
Status     string `json:"status"`

但它们并不总是必需的,例如用户可以仅传递 Offset 并忽略其他。他甚至可以发送0个参数。我怎样才能做到这一点?


正确答案


从 JSON 文本中解组值时,json 包不要求所有字段出现在 JSON 中,也不保证所有 JSON 字段都有匹配的 Go 字段。

所以你没有什么特别的事情要做,只需将你所拥有的东西整理成 Go 值你想要或可能想要的东西即可。

需要注意的一点是,如果 JSON 文本中缺少某个字段,则 json 包不会更改相应的 Go 字段,因此如果以“新鲜”开头,零值,该字段将保留其类型的零值。

大多数情况下,这足以检测字段(在 JSON 中)是否存在,例如,如果在 Go 结构中您有一个 string 类型的 SortBy 字段,如果 JSON 中缺少该字段,它将保留空 string: "".

如果零值是有用且有效的,那么您可以转向使用指针。例如,如果在您的应用程序中,空 string 将是有效的 SortBy 值,您可以将此字段声明为指针:*string。在这种情况下,如果 JSON 文本中缺少它,它将保留 nil,即任何指针类型的零值。

请参阅此示例:

type Data struct {
    I int
    S string
    P *string
}

func main() {
    var d Data
    var err error

    d, err = Data{}, nil
    err = json.Unmarshal([]byte(`{"I":1, "S":"sv", "P":"pv"}`), &d)
    fmt.Printf("%#v %v\n", d, err)

    d, err = Data{}, nil
    err = json.Unmarshal([]byte(`{"I":1}`), &d)
    fmt.Printf("%#v %v\n", d, err)

    d, err = Data{}, nil
    err = json.Unmarshal([]byte(`{"S":"abc"}`), &d)
    fmt.Printf("%#v %v\n", d, err)
}

输出(在 Go Playground 上尝试一下):

main.Data{I:1, S:"sv", P:(*string)(0x1050a150)} 
main.Data{I:1, S:"", P:(*string)(nil)} 
main.Data{I:0, S:"abc", P:(*string)(nil)} 

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>