需要以 [] 这种格式传递空切片而不是 ""
Need to pass empty slice in [] this format and not as ""
我有一个 api 有一个 body 属性
输入注册结构{
环境[]字符串json:"env"
}
在调用 api 时,我需要将“env”的值作为可选参数传递。
IE。
采用这种格式 env: []
,而不是 env: ""
有谁能帮忙吗
我试过使用 len(env)==0 但它会将 "" 和 [] 都设为空。
我也尝试过使用 reflect.ValueOf(Reg.Env).Kind() == reflect.Slice 来区分 "" 和 [] 但它只将这两个值作为切片。
根据您需要发送的内容,有多种选择:
案例A:
Reg{}
将是 json-serialized 到 {"env": null}
案例B:
Reg{Env: []string{} }
将是 json-serialized 到 {"env": []}
案例C:
如果像这样将 ,omitempty
添加到 struct 标记中:
type Reg struct {
Env []string `json:"env,omitempty"`
}
那么 Reg{}
将是 json-serialized 到 {}
参见此处的代码示例:https://go.dev/play/p/lKI91VCoI0V
如果你检查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
使用解码器时也会发生同样的情况。 IE。来自 http 请求正文。
var r struct { Env []string `json:"env"` }
dec := json.NewDecoder(strings.NewReader(`{"env": ""}`))
if err := dec.Decode(&r); err != nil { fmt.Println(err) }
我有一个 api 有一个 body 属性
输入注册结构{
环境[]字符串json:"env"
}
在调用 api 时,我需要将“env”的值作为可选参数传递。
IE。
采用这种格式 env: []
,而不是 env: ""
有谁能帮忙吗
我试过使用 len(env)==0 但它会将 "" 和 [] 都设为空。 我也尝试过使用 reflect.ValueOf(Reg.Env).Kind() == reflect.Slice 来区分 "" 和 [] 但它只将这两个值作为切片。
根据您需要发送的内容,有多种选择:
案例A:
Reg{}
将是 json-serialized 到 {"env": null}
案例B:
Reg{Env: []string{} }
将是 json-serialized 到 {"env": []}
案例C:
如果像这样将 ,omitempty
添加到 struct 标记中:
type Reg struct {
Env []string `json:"env,omitempty"`
}
那么 Reg{}
将是 json-serialized 到 {}
参见此处的代码示例:https://go.dev/play/p/lKI91VCoI0V
如果你检查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
使用解码器时也会发生同样的情况。 IE。来自 http 请求正文。
var r struct { Env []string `json:"env"` }
dec := json.NewDecoder(strings.NewReader(`{"env": ""}`))
if err := dec.Decode(&r); err != nil { fmt.Println(err) }