【发布时间】:2021-08-21 22:09:46
【问题描述】:
我是 GoLang 的新手,有一个关于从嵌套 JSON 数据填充数组的问题。我昨天查看了堆栈溢出,找不到这个确切的主题,只有相似的线程,但不提供直接的解决方案。
假设我有一些嵌套的 JSON 数据,如下所示:
如何创建嵌套结构来填充收盘价数组。我的代码如下。 我的目标是有一个数组,其中 arr = {157.92, 142.19, 148.26}
提前致谢!我非常感谢任何帮助!
{
"history": {
"day": [
{
"date": "2019-01-02",
"open": 154.89,
"high": 158.85,
"low": 154.23,
"close": 157.92,
"volume": 37039737
},
{
"date": "2019-01-03",
"open": 143.98,
"high": 145.72,
"low": 142.0,
"close": 142.19,
"volume": 91312195
},
{
"date": "2019-01-04",
"open": 144.53,
"high": 148.5499,
"low": 143.8,
"close": 148.26,
"volume": 58607070
}
...
]
}
}
// DATA STRUCTURE
type Hist struct {
History string `json:"history"`
}
type Date struct {
Day string `json:"day"`
}
type Price struct {
Close []string `json:"close"`
}
// HISTORICAL QUOTES
func get_quotes(arg1 string, arg2 string, arg3 string, arg4 string) []string {
// arg1 = ticker symbol, arg2 = start, arg3 = end, arg4 = access token
// TRADIER API
apiUrl := "https://sandbox.tradier.com/v1/markets/history?symbol=" + arg1 + "&interval=daily&start=" + arg2 + "&end=" + arg3
u, _ := url.ParseRequestURI(apiUrl)
urlStr := u.String()
client := &http.Client{}
r, _ := http.NewRequest("GET", urlStr, nil)
r.Header.Add("Authorization", "Bearer "+arg4)
r.Header.Add("Accept", "application/json")
resp, _ := client.Do(r)
responseData, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Status)
fmt.Println(string(responseData))
var response Price
json.NewDecoder(resp.Body).Decode(&response)
fmt.Println(response.Close)
return response.Close
}
【问题讨论】:
-
“我昨天查看了堆栈溢出,找不到这个确切的主题,只有类似的线程,但不提供直接解决方案。”您是否尝试过实施自己的解决方案?你能显示那个代码吗? SO 不是代码编写服务。
-
JSON 的“day”字段不包含 JSON 对象(其中解码可以匹配键“close”);相反,它包含一个列表。您在这里基本上有两个选择:1)将“day”的值解组为
struct类型的切片,每个类型包含string类型的单个字段标记json:"close",然后对结果进行后处理:遍历结果切片并从切片的元素中提取值; 2) 使用 JSON 解码器的“流”工具来遍历列表值并在旅途中生成结果切片。我强烈建议现在坚持第一种方法。 -
The language is called Go——与你不说 PytongLang、JavaScriptLang 等的原因基本相同
-
@Adrian 是的,我已经尝试实施自己的解决方案,附在上面。
-
@kostix 你能举个例子吗,我不太确定我理解了