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

How to work with non required JSON parameters in Go?

嗨,我正在休息 API Go,我希望用户传递 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 字段,因此如果您以 "fresh", zero value, 该字段将保留其类型的零值。

大多数时候这足以检测字段的存在或不存在(在 JSON 中),例如,如果在 Go 结构中你有一个 SortBy 类型的字段 string,如果 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>