我想解码一个请求 JSON,其中字段的值可以是单个字符串或数组(列表)。
我知道如何单独解析 if 。但我正在寻找一种方法来让动态解码器来解析它们。
JSON 中的 value
字段就是我所说的情况
单值示例:
{
"filter":{
"op":"IN",
"field":"name",
"value": "testDuplicate"
}
}
多值示例:
{
"filter":{
"op":"IN",
"field":"name",
"value":["testDuplicate","tt"]
}
}
单值结构:
type DocumentTypeSearchRequest struct {
Filter DocTypeFilter `json:"filter"`
}
type DocTypeFilter struct {
Op string `json:"op"`
Field string `json:"field"`
Value string `json:"value"`
}
多值结构:
type DocumentTypeSearchRequest struct {
Filter DocTypeFilter `json:"filter"`
}
type DocTypeFilter struct {
Op string `json:"op"`
Field string `json:"field"`
Value []string `json:"value"`
}
一种解决方案是尝试使用其中一个解码,如果失败则使用另一个,但我不确定这是否是处理此问题的正确方法。
最佳答案
您需要一个自定义解码器。我曾经讲过类似的情况in this video :
type Value []string
func (v *Value) UnmarshalJSON(p []byte) error {
if p[0] == '[' { // First char is '[', so it's a JSON array
s := make([]string, 0)
err := json.Unmarshal(p, &s)
*v = Value(s)
return err
}
// else it's a simple string
*v = make(Value, 1)
return json.Unmarshal(p, &(*v)[0])
}
通过 Value
的定义,您的结构将变得类似于:
type DocTypeFilter struct {
Op string `json:"op"`
Field string `json:"field"`
Value Value `json:"value"`
}
现在您的 Value
字段将始终是一个 slice ,但当您的 JSON 输入是字符串而不是数组时,它可能只包含单个值。
关于json - 如何解码 Json 中的多值/单值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65198141/