为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕盖茨4494581 2023-03-29 16:10:17
我正在处理一个返回 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)并将 unstructuredJSON 传递给函数: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 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

假设您知道顶级键,例如bpi,等disclaimer,time并且您正在谈论的“动态数据对”是该字段的一部分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


查看完整回答
反对 回复 2023-03-29
  • 1 回答
  • 0 关注
  • 81 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信