json - 如何解码 Json 中的多值/单值

标签 json go

我想解码一个请求 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])
}

Playground link

通过 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/

相关文章:

ajax - 检测是否是AJAX请求

mongodb - Golang - MongoDB (mgo) 检索插入的文件(BSON 不是 GridFS)

go - 将四字符日期字符串转换为日期字符串

json - Scala 中的 JsOnobject 和 JsValue 有什么区别?

json - 如何更改 REST DataSnap 中的内容类型响应

Java 字符串到对象列表

arrays - 在go中解码嵌套的json对象

arrays - 如何在 Go 中将错误数组转换为 JSON

json - 这个简洁的 JSON 文档的 Go 结构是什么?

sql - 如何在 go-pg(带 Go 的 Postgres ORM)中查询嵌套结构中的子字段?