json - 在 Go 中将 Json 数据解码到 map 中

标签 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 个数据对的任何值)。

我试图只获取日期和价格对并将它们放入 map 中供以后使用,但我没有找到一种直接的方法来做这件事。当我将它放入一个 json-to-go 自动结构生成器中时,它将为定价创建一个静态的命名结构。

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

var 非结构化 JSON 接口(interface){} json.Unmarshal(正文, &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)
    }
}

有更好的方法吗?

最佳答案

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

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

现在您的每一对都将被正确输入并包含在 APIResp.BPI 中 map 。像您已经在做的那样解码;

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

关于json - 在 Go 中将 Json 数据解码到 map 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52161097/

相关文章:

go - 为什么我的 GOPATH/src 刚安装后包含几个目录?

go - func (e *errorString) FormatError(p Printer) (下一个错误)

json - 尝试将域类序列化为JSON时发生Grails堆栈溢出错误

javascript - 使用 JavaScript 的 md5 的较短版本..?

json - 使用使用 SwiftyJSON 的函数填充 Tableview

go - Windows API 错误 "The handle is invalid"

json - 如何计算嵌套在 Postgresql JSON 中的数字?

json - 如何在 SWIFT 中处理 JSON 中的空值

regex - golang 中嵌套组的正则表达式问题

javascript - 如何在golang中顺序处理并发请求?