如何在 Go 中解析数组元素有多种类型的 JSON?

How do I parse JSON in Go where array elements have more than one type?

如何将 https://api.twitchinsights.net/v1/bots/online 的 JSON 响应解析为 Go 中的数组并遍历每个条目?

我不明白这个结构,因为没有键只有值...

谁能帮忙解释一下这是怎么回事?

我已经映射了它,但后来我得到了类似

的东西
map[_total:216 bots:[[anotherttvviewer 67063 1.632071051e+09] [defb 26097 1.632071051e+09] [commanderroot 17531 1.632071048e+09] [apparentlyher 16774 1.63207105e+09]... 

但我无法遍历地图。

因为 API 您正在处理 return 的数据,它可以是字符串或数字(在数组数组 属性 bots 中) ,您需要使用 []interface{} 作为该数组每个元素的类型,因为空接口 (https://tour.golang.org/methods/14) 在 运行 时适用于任何类型。

type response struct {
    Bots  [][]interface{} `json:"bots"`
    Total int             `json:"_total"`
}

然后,当您遍历切片中的每个项目时,您可以使用反射检查其类型。

对于架构中的 API 到 return 数据是理想的,其中每个 JSON 数组元素都与它的每个其他元素具有相同的 JSON 类型大批。这将更容易解析,尤其是使用像 Go 这样的静态类型语言。

例如,API 可以 return 数据如下:

{
  "bots": [
    {
      "stringProp": "value1",
      "numberProps": [
        1,
        2
      ]
    }
  ],
  "_total": 1
}

然后,您可以在不使用空接口的情况下编写表示 API 响应的结构:

type bot struct {
    StringProp  string    `json:"stringProp"`
    NumberProps []float64 `json:"numberProps"`
}

type response struct {
    Bots  []bot `json:"bots"`
    Total int   `json:"_total"`
}

但有时您无法控制正在使用的 API,因此您需要乐于以更动态的方式从响应中解析数据。如果您确实可以控制 API,您应该考虑 return 以这种方式处理数据。