我正在处理一个返回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)
}
}
有一个更好的方法吗?
假设您知道顶级密钥,例如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