我在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/

    10-16 12:34