我在data.json中具有以下内容:
{
"table":"orderBook10",
"action":"update",
"data":[
{
"symbol":"XBTUSD",
"bids":[
[
3996,
49137
],
[
3995.5,
116
],
[
3995,
165
],
[
3994.5,
166
],
[
3994,
237
],
[
3993.5,
45
],
[
3992,
20064
],
[
3991.5,
209
],
[
3991,
134
],
[
3990.5,
2948
]
],
"timestamp":"2019-03-23T00:34:40.505Z",
"asks":[
[
3996.5,
975
],
[
3997,
289
],
[
3997.5,
334
],
[
3998,
419
],
[
3998.5,
423
],
[
3999,
930
],
[
3999.5,
547
],
[
4000,
538
],
[
4000.5,
703
],
[
4001,
997
]
]
}
]
}
到目前为止,我的程序可以提取
data
字段:package main
import (
"encoding/json"
"fmt"
"io/ioutil"
)
func main() {
dat, err := ioutil.ReadFile("./data.json")
if err != nil {
panic(err)
}
var ob map[string]interface{}
if err := json.Unmarshal(dat, &ob); err != nil {
panic(err)
}
fmt.Println(ob["data"])
}
我现在想提取嵌套的“请求”字段。
我试过了:
data := ob["data"]
asks := data["asks"].([][]int)
但这会导致我无法解读的语法错误。
如何将嵌套的
asks
字段分配给变量? 最佳答案
您的ob["data"]
JSON
结构如下:
([]interface {}) {
(map[string]interface {}) {
(string) "": (string) "",
(string) "": ([]interface {}) {
([]interface {}) {
(float64),
(float64)
}
},
(string) "": (string) "",
(string) "": ([]interface {}) {
([]interface {}) {
(float64),
(float64)
}
}
}
}
因此您需要使用以下内容:ob["data"].([]interface{})[0].(map[string]interface{})["asks"]
哪一个:ob["data"]
转换为[]interface{}
[0]
map[string]interface{}
和"asks"
注意:
除非您确定,否则请始终将以下形式
t, ok := i.(T)
用于type assertions:如果我持有T,则t将是基础值,而ok将为真。
如果不是,则ok将为false,t将为T类型的零值,并且不会发生恐慌。
关于go - 如何提取嵌套的JSON数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55309554/