解组不同类型的数组

Unmarshal array of different types

我有一个有效的 JSON 字符串需要解组,但该数组很难适合解组的结构,我不知道该怎么做。它看起来有点像这样:

[
    [ "name", "contains", "test" ],
    "and",
    [ "group", "=", "123" ],
    "and",
    [
        [
            "date", ">=", "2020-06-30T23:00:00Z"
        ],
        "and",
        [
            "date", "<", "2020-07-31T23:00:00Z"
        ]
    ]
]

它也可以有更深的数组。

到目前为止我尝试的是

f := r.URL.Query().Get("filter")
var dat []map[string]interface{}
// Also failed with: dat := make([]map[string]interface{}, 100)

if err := json.Unmarshal([]byte(f), &dat); err != nil {
    panic(err)
}

而且错误总是一样的panic: json: cannot unmarshal array into Go value of type map[string]interface {}

由于您的 json 数据很复杂,您不能将其定义为 struct 或任何类型,所以我通常只尝试 interface{}.

在您的情况下,json 数据中的数组内容不是键值结构。因此你不能将它解组为 map[string]interface{} 的数组。所以,试试这个。

var jsonStr = `
[
    [ "name", "contains", "test" ],
    "and",
    [ "group", "=", "123" ],
    "and",
    [
        [
            "date", ">=", "2020-06-30T23:00:00Z"
        ],
        "and",
        [
            "date", "<", "2020-07-31T23:00:00Z"
        ]
    ]
]
`

func main() {
    var data interface{}

    if err := json.Unmarshal([]byte(jsonStr), &data); err != nil {
        panic(err)
    }
    
    fmt.Println(data)
}

示例:https://play.golang.org/p/fC8XVvHutzm

我经常用https://mholt.github.io/json-to-go/把json转成结构体