Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Go中将Json数据解组到映射中_Json_Go - Fatal编程技术网

在Go中将Json数据解组到映射中

在Go中将Json数据解组到映射中,json,go,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" } 但是,具有附带日

我正在处理一个返回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非结构化JSON接口{} Unmarshalbody和非结构化json

并将非结构化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、免责声明、时间等,并且您正在谈论的动态数据对是bpi字段的一部分,并且bpi的每个成员的键和值类型始终是字符串:十进制数,您可以这样做

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

我不完全理解你的输入格式。你能举几个例子来说明你所描述的动态日期范围吗?@Flimzy在bpi部分,我可以从api请求一个日期范围,这样它可以是一个100天的数据列表,看起来像一个简单的地图。map[string]float64不适用于您有什么原因吗?您在问题中使用的方法过于复杂,是的。除非有您没有描述的惊喜,否则只需使用如下字段对结构进行解组:BPI map[string]float64您的JSON不是非结构化的或动态的。