需要以 [] 这种格式传递空切片而不是 ""

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) }

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