如何在 Go 中动态解析 JSON?

How dynamically Parse JSON in Go?

所以我在用 Go 解析 JSON 文件时遇到了一些问题。我已经尝试了很多解决方法,但我似乎没有找到解决方案。

假设我有一些 JSON 文件看起来像这样

{
    "products": [
        {
            "id": 201,
            "name": "Nulla",
            "price": 207,
            "categoryId": 1,
            "rate": 2.44,
            "content": "Culpa sed tenetur incidunt quia veniam sed molliti",
            "review": 78,
            "imageUrl": "https://dummyimage.com/400x350"
        },
        {
            "id": 202,
            "name": "Corporis",
            "price": 271,
            "categoryId": 1,
            "rate": 2.18,
            "content": "Nam incidunt blanditiis odio inventore. Nobis volu",
            "review": 67,
            "imageUrl": "https://dummyimage.com/931x785"
        },
        {
            "id": 203,
            "name": "Minus",
            "price": 295,
            "categoryId": 1,
            "rate": 0.91,
            "content": "Quod reiciendis aspernatur ipsum cum debitis. Quis",
            "review": 116,
            "imageUrl": "https://dummyimage.com/556x985"
        }
    ]
}

我想动态解析它(不为它创建结构)。我已经尝试使用 map[string]interface{} 方式,但它不起作用。我已经尝试了另一个名为 jsoniter 的第三方库,但它也不起作用。

我能让它“以某种方式”工作的唯一方法是尝试用方括号包裹 json_string [jsonstring]

这是我的代码。

file, _ := ioutil.ReadFile("p1.json")
var results []map[string]interface{}
json.Unmarshal(file, &results)
fmt.Printf("%+v", results) // Output [] 

经常检查错误。检查来自 json.Unmarshal 的错误,您可以看到:

2009/11/10 23:00:00 json: cannot unmarshal object into Go value of type []map[string]interface {}

您正在使用地图的一部分 []map[string]interface{} 编组到地图,而不是您想要的地图:

// var results []map[string]interface{} // bad-type
var results map[string]interface{} // correct-type
err := json.Unmarshal(body, &results)
if err != nil {
    log.Fatal(err)
}

fmt.Printf("%+v", results) // Output [map[categoryId:1 content:Culpa sed tenetur incidunt quia veniam sed molliti id:20 ...

https://play.golang.org/p/4OpJiNlB27f