json - 如何在 Go 中使用非必需的 JSON 参数?

标签 json go unmarshalling

您好,我正在使用 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 字段,因此如果您从“新鲜”开始,zero value , 该字段将保留其类型的零值。

大多数时候这足以检测字段的存在或不存在(在 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)} <nil>
main.Data{I:1, S:"", P:(*string)(nil)} <nil>
main.Data{I:0, S:"abc", P:(*string)(nil)} <nil>

关于json - 如何在 Go 中使用非必需的 JSON 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39465504/

相关文章:

php - 如何在php中转换mongo db查询

javascript - 使用 GitHub api 在 dojo 中执行 PUT 更新返回 400 : problems parsing JSON

当我编译新代码时,Go 的 JWT token 过期

java - getQauntdate()方法解释

java - 在 Java 中解码 XML 时遇到问题

java - 使用 MOXy 将 JSON 字符串解码为 "Object"

json - 将文件中的json值设置为redis

json - Spectron 测试产生 JScript 语法错误

arrays - 在 Golang 中获取指针数组的长度

java - JAXB 注释在 getter、setter 和成员上的区别是什么?