提问人:Utsav Mishra 提问时间:3/26/2022 更新时间:3/26/2022 访问量:296
需要以 [] 这种格式传递空切片,而不是作为 “”
Need to pass empty slice in [] this format and not as ""
问:
我有一个 api,其属性为 body
类型 Reg struct{
Env []字符串json:"env"
}
在调用api时,我需要传递“env”的值作为可选参数。
即
以这种格式,而不是任何人都可以帮忙。env: []
env: ""
我尝试使用 len(env)==0,但它将 “” 和 [] 都视为空。 我也尝试过使用 reflect。ValueOf(Reg.Env)。Kind() == 反射。Slice 用于区分 “” 和 [],但它仅将这两个值作为 slice。
答:
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") }
评论
env: ""
env:[]
env:[]
If