如果某些值的"field/key"变化或未知,则在定义 JSON 数据的结构时应使用什么 Go 标记?



在尝试解析时间序列数据时,我发现JSON数据中的一个关键字段是时间戳(显然是字符串格式(。但是事先为相同的结构创建是不可能的,因为我无论如何都不知道时间戳字符串。

这是 JSON 的样子:

"Time Series (5min)": {
"2020-01-17 16:00:00": {
"1. open": "167.2000",
"2. high": "167.3400",
"3. low": "167.0100",
"4. close": "167.0500",
"5. volume": "1646699"
},
"2020-01-17 15:55:00": {
"1. open": "166.9000",
"2. high": "167.1600",
"3. low": "166.8500",
"4. close": "167.1500",
"5. volume": "622999"
},
"2020-01-17 15:50:00": {
"1. open": "166.7241",
"2. high": "166.9200",
"3. low": "166.7200",
"4. close": "166.8999",
"5. volume": "271723"
}
}

一些的结构可能看起来像:


type TIMESTAMP struct {
Open   string `json:"1. open"`
High   string `json:"2. high"`
Low    string `json:"3. low"`
Close  string `json:"4. close"`
Volumn string `json:"5. volumn"`
}
type TIMESERIES struct {
TimeStamp TIMESTAMP `json:""`  //DON'T KNOW HOW TO IMPLEMENT THIS
}

如何处理这种情况?有没有相同的 Go 结构标签?

2020-01-17 16:00:00这样的键似乎是动态生成的,而不是固定的,所以你可以像这样使用map来做任意键

package main
import (
"fmt"
"encoding/json"
)
type TIMESTAMP struct {
Open   string `json:"1. open"`
High   string `json:"2. high"`
Low    string `json:"3. low"`
Close  string `json:"4. close"`
Volumn string `json:"5. volumn"`
}

type TIMESERIES map[string]map[string]TIMESTAMP
func main() {
test := []byte(`{
"Time Series (5min)": {
"2020-01-17 16:00:00": {
"1. open": "167.2000",
"2. high": "167.3400",
"3. low": "167.0100",
"4. close": "167.0500",
"5. volume": "1646699"
},
"2020-01-17 15:55:00": {
"1. open": "166.9000",
"2. high": "167.1600",
"3. low": "166.8500",
"4. close": "167.1500",
"5. volume": "622999"
},
"2020-01-17 15:50:00": {
"1. open": "166.7241",
"2. high": "166.9200",
"3. low": "166.7200",
"4. close": "166.8999",
"5. volume": "271723"
}
}
}`)
var response TIMESERIES
if err := json.Unmarshal(test, &response); err != nil {
fmt.Println(err)
return
}
fmt.Printf("%+v", response)
}

最新更新