如何通过Golang的json解组嵌套数组中的成对值

如何通过Golang的json解组嵌套数组中的成对值,go,Go,JSON数据如下所示: {"xxx_xxx":{"asks":[[0.00000315,1022.53968253],[0.00000328,200],[0.00000329,181.70008541]],"bids":[[0.00000254,2685.36319716],[0.00000253,600],[0.0000025,1000]]}} json.Unmarshal(r, &depth) {{[{0 0} {0 0} {0 0} ] [{0 0} {0 0} {0 0} ]

JSON数据如下所示:

{"xxx_xxx":{"asks":[[0.00000315,1022.53968253],[0.00000328,200],[0.00000329,181.70008541]],"bids":[[0.00000254,2685.36319716],[0.00000253,600],[0.0000025,1000]]}}
json.Unmarshal(r, &depth)
{{[{0 0} {0 0} {0 0} ] [{0 0} {0 0} {0 0} ]}}
结构为:

type Depth struct {
    XXX_XXX struct {
        Asks []struct {
            Num0 float64 `json:"0"`
            Num1 float64 `json:"1"`
        } `json:"asks"`
        Bids []struct {
            Num0 float64 `json:"0"`
            Num1 float64 `json:"1"`
        } `json:"bids"`
    } `json:"xxx_xxx"`
}
当尝试在go lang中映射时,如下所示:

{"xxx_xxx":{"asks":[[0.00000315,1022.53968253],[0.00000328,200],[0.00000329,181.70008541]],"bids":[[0.00000254,2685.36319716],[0.00000253,600],[0.0000025,1000]]}}
json.Unmarshal(r, &depth)
{{[{0 0} {0 0} {0 0} ] [{0 0} {0 0} {0 0} ]}}
将获得如下所示的所有零数组:

{"xxx_xxx":{"asks":[[0.00000315,1022.53968253],[0.00000328,200],[0.00000329,181.70008541]],"bids":[[0.00000254,2685.36319716],[0.00000253,600],[0.0000025,1000]]}}
json.Unmarshal(r, &depth)
{{[{0 0} {0 0} {0 0} ] [{0 0} {0 0} {0 0} ]}}
结果并不像我预料的那样。 如何解决这个问题

以下是操场上的代码:

我相信这是因为您的数组是Go中的结构,但是您的JSON有数组的数组,它们是不同的。您可能希望将
[0.000003151022.53968253]
更改为
{“0”:--“1”:--
,依此类推

或者,您可以有一个单独的Go结构,其中Asks是一个由float64等组成的数组,但由于数组可能包含多于或少于2个元素,因此这种结构的类型安全性较低

现在,在JSON中,数组元素可以被数字键引用,数组可以被视为对象,但在JSON中,对象和数组是不同的


编辑:根据下面的注释指定,在关键字名称周围添加引号。我的错误:)

我相信这是因为您的数组是Go中的结构,但是您的JSON有数组数组,它们是不同的。您可能希望将
[0.000003151022.53968253]
更改为
{“0”:--“1”:--
,依此类推

或者,您可以有一个单独的Go结构,其中Asks是一个由float64等组成的数组,但由于数组可能包含多于或少于2个元素,因此这种结构的类型安全性较低

现在,在JSON中,数组元素可以被数字键引用,数组可以被视为对象,但在JSON中,对象和数组是不同的


编辑:根据下面的注释指定,在关键字名称周围添加引号。我的错误:)

询问和出价是数组类型而不是结构类型

这是一张工作票

下面的示例添加了一个
Nums
类型,该类型具有可以使用的
One
Two
方法,因为它们似乎是您期望的格式。您可以在这些方法中添加一些错误检查,以确保格式也正确

type Depth struct {
    XXX XXX `json:"xxx_xxx"`
}

type XXX struct {
    Asks []Nums `json:"asks"`
    Bids []Nums `json:"bids"`
}

type Nums []float64

func (n Nums) One() float64 {
    if len(n) > 0 {
         return n[0]
    }
    return 0
}

func (n Nums) Two() float64 {
    if len(n) > 1 {
        return n[1]
    }
    return 0
}

ask和bids是数组类型,而不是结构类型

这是一张工作票

下面的示例添加了一个
Nums
类型,该类型具有可以使用的
One
Two
方法,因为它们似乎是您期望的格式。您可以在这些方法中添加一些错误检查,以确保格式也正确

type Depth struct {
    XXX XXX `json:"xxx_xxx"`
}

type XXX struct {
    Asks []Nums `json:"asks"`
    Bids []Nums `json:"bids"`
}

type Nums []float64

func (n Nums) One() float64 {
    if len(n) > 0 {
         return n[0]
    }
    return 0
}

func (n Nums) Two() float64 {
    if len(n) > 1 {
        return n[1]
    }
    return 0
}

谢谢你的回复,但是,我无法更改源json文件。@temple得到了它-那么,另一个答案是正确的。您将解组浮点64数组的数组。当然,您可以使用该代码进行解组,然后使用该数据填充更安全的类型结构,并删除任何无效数据(例如,在一次询问/出价中包含少于或多于2个项目的数据)。谢谢您的回复,但是,我无法更改源json文件。@temple得到了它-然后,另一个答案是正确的。您将解组浮点64数组的数组。当然,您可以使用该代码进行解组,然后使用数据填充类型更安全的结构,并删除任何无效数据(例如,在一个询问/出价中包含少于或多于2项的数据)。谢谢,我想这就是答案。你帮我节省了很多时间。谢谢,我想这就是答案。你帮我节省了很多时间。