在Go中将Json数据解组到地图中

时间:2018-09-04 07:34:24

标签: json go

我正在处理一个返回json数据的api,例如:

    {
  "bpi": {
    "2018-06-01": 128.2597,
    "2018-06-02": 127.3648
  },
  "disclaimer": "something here.",
  "time": {
    "updated": "Sep 6, 2013 00:03:00 UTC",
    "updatedISO": "2013-09-06T00:03:00+00:00"
  }

但是带有附带日期的价格数据可以返回动态日期范围(即,可以是从1个数据对到1000个数据对的任何值)。

我正在尝试仅获取日期和价格对,并将其放入地图中以供以后使用,但是我没有找到直接的方法。当我将其放入json-to-go自动结构生成器中时,它将为定价创建一个静态的命名结构。

这是我动态处理数据的最佳尝试。我正在从http get的响应主体传递一个空接口,具体是:

var unstructuredJSON interface{} json.Unmarshal(body, &unstructuredJSON)

并将非结构化JSON传递给函数:

func buildPriceMap(unstructuredJSON interface{}, priceMap map[string]float64) {
jsonBody := unstructuredJSON.(map[string]interface{})

for k, v := range jsonBody {
    switch vv := v.(type) {
    case string:
        // Do Nothing
    case float64:
        priceMap[k] = vv
    case interface{}:
        buildPriceMap(vv, priceMap)
    default:
        log.Fatal("Json unknown data handling unmarshal error: ", k, vv)
    }
}

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

假设您知道顶级键,例如bpidisclaimertime等,您正在谈论的“动态数据对”是bpi字段的一部分,并且键和值的类型bpi的每个成员始终都是string: decimal number,您会做类似的事情。...

type APIResp struct {
    BPI        map[string]float64 `json:"bpi"`
    Disclaimer string
    // other fields
}

现在,您的每个配对都将正确键入并包含在APIResp.BPI映射中。像您已经在做的那样将其解组;

var r APIResp
err := json.Unmarshal(body, &r)
// TODO: check err