需要以 [] 这种格式传递空切片,而不是作为 “”

Need to pass empty slice in [] this format and not as ""

提问人:Utsav Mishra 提问时间:3/26/2022 更新时间:3/26/2022 访问量:296

问:

我有一个 api,其属性为 body

类型 Reg struct{ Env []字符串json:"env" }

在调用api时,我需要传递“env”的值作为可选参数。 即 以这种格式,而不是任何人都可以帮忙。env: []env: ""

我尝试使用 len(env)==0,但它将 “” 和 [] 都视为空。 我也尝试过使用 reflect。ValueOf(Reg.Env)。Kind() == 反射。Slice 用于区分 “” 和 [],但它仅将这两个值作为 slice。

数组 json go slice

评论

2赞 The Fool 3/26/2022
你能添加更多上下文吗?通常,空切片不表示为空字符串。或者也许我理解错了,在这种情况下,你可以尝试解释更多。
0赞 Utsav Mishra 3/26/2022
所以是的,基本上我有一个 api,我需要进行内部验证,如果我通过它应该抛出一个错误,如果为空,env 应该以这种格式给出。我使用了if(len(Reg.Env)==0){ fmt。Println(“env should be given in this format if empty”) 现在的问题是,当有人也使用正确的格式时,会执行上述条件而不是接受格式。env: ""env:[]env:[]If
0赞 Utsav Mishra 3/26/2022
@TheFool空切片并不表示为空字符串,因此如果有人试图故意在切片中传递空字符串,它应该会引发错误。

答:

0赞 Fulldump 3/26/2022 #1

根据您需要发送的内容,有多种选择:

案例 A:将 json 序列化为Reg{}{"env": null}

案例 B:将 json 序列化为Reg{Env: []string{} }{"env": []}

案例C: 如果像这样添加到结构标签中:,omitempty

type Reg struct {
    Env []string `json:"env,omitempty"`
}

然后将被 json 序列化为Reg{}{}

请参阅此处的代码示例:https://go.dev/play/p/lKI91VCoI0V

1赞 The Fool 3/26/2022 #2

例如,如果检查错误,您将知道用户是否传递了无效的输入。json.Unmarshal

var r struct { Env []string `json:"env"` }

if err := json.Unmarshal([]byte(`{"env": ""}`), &r); err != nil {
    fmt.Println(err)
}

生成以下错误消息:

json: cannot unmarshal string into Go struct field .env of type []string

https://go.dev/play/p/LozhJ14C7zj


使用解码器时也会发生同样的情况。即来自 http 请求正文。

var r struct { Env []string `json:"env"` }

dec := json.NewDecoder(strings.NewReader(`{"env": ""}`))

if err := dec.Decode(&r); err != nil { fmt.Println(err) }

https://go.dev/play/p/_XpY3jquxVx

评论

0赞 Utsav Mishra 3/28/2022
对于验证,我使用了 JSON msg 作为 So it worked。谢谢var r struct { Env []string `json:"env"` } if err := json.Unmarshal([]byte(`{"env": ""}`), &r); err == errors.New("json: cannot unmarshal string into Go struct field .env of type []string") { fmt.Println("Please provide input in slice format") }