如何在 go 中解析奇怪的 JSON

-2 json go

我正在尝试在 go 中解析下面的 json,但很难找到要解码的类型或结构。我对格式没有任何控制权,每次调用返回的股票可能不同,所以我不能有一个名为 AAPL 或 TSLA 的类型。我最终想要一个包含“引用”部分中的数据的对象数组/列表。就像是:

type Stock struct {
  Symbol string
  CompanyName string
  latestPrice float64
}
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

{
  "AAPL": {
    "quote": {
      "symbol": "AAPL",
      "companyName": "Apple, Inc.",
      "open": 308,
      "close": 315.01,
      "high": 317.05,
      "low": 307.24,
      "latestPrice": 315.01,
      "marketCap": 1365360443400,
      "peRatio": 24.49,
      "week52High": 327.85,
      "week52Low": 170.27
    }
  },
  "TSLA": {
    "quote": {
      "symbol": "TSLA",
      "companyName": "Tesla, Inc.",
      "open": 790.51,
      "close": 811.29,
      "high": 824,
      "low": 785,
      "latestPrice": 811.29,
      "marketCap": 150389638590,
      "peRatio": -963.76,
      "week52High": 968.99,
      "week52Low": 176.99
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

mko*_*iva 5

首先,您必须导出所有字段,然后map只要预先不知道字段名称,就可以使用 a 。解组后,您可以在地图上进行调整,并将数据放入您想要的任何其他结构中。

type Stock struct {
    Symbol      string
    CompanyName string
    LatestPrice float64
}

func main() {
    var m map[string]struct{ Quote Stock }
    if err := json.Unmarshal(data, &m); err != nil {
        panic(err)
    }

    var list []Stock
    for _, v := range m {
        list = append(list, v.Quote)
    }

    fmt.Println(list)
}
Run Code Online (Sandbox Code Playgroud)

https://play.golang.com/p/ZXlrWWWgxvB