为了账号安全,请及时绑定邮箱和手机立即绑定

解组没有键的嵌套 json

解组没有键的嵌套 json

Go
慕尼黑5688855 2022-04-26 10:45:18
我无法在从APIjson接收的 Golang 结构中转换以下内容:Kraken{    "error": [],    "result": {        "LINKUSD": {            "asks": [                ["2.049720", "183.556", 1576323009],                ["2.049750", "555.125", 1576323009],                ["2.049760", "393.580", 1576323008],                ["2.049980", "206.514", 1576322995]            ],            "bids": [                ["2.043800", "20.691", 1576322350],                ["2.039080", "755.396", 1576323007],                ["2.036960", "214.621", 1576323006],                ["2.036930", "700.792", 1576322987]            ]        }    }}使用json-to-go,他给了我以下结构:type AutoGenerated struct {    Error  []interface{} `json:"error"`    Result struct {        LINKUSD struct {            Asks [][]interface{} `json:"asks"`            Bids [][]interface{} `json:"bids"`        } `json:"LINKUSD"`    } `json:"result"`}显然,我无法LINKUSD对每个货币对都会改变的原因进行硬编码。我创建了两个结构来完成任务,但我无法将结果转换为结构。type BitfinexOrderBook struct {    Pair string          `json:"pair"`    Asks []BitfinexOrder `json:"asks"`    Bids []BitfinexOrder `json:"bids"`}type BitfinexOrder struct {    Price     string    Volume    string    Timestamp time.Time}我的第一次尝试是使用反射。阅读上面发布的 JSON 数据,我能够检索包含asksandbids列表的接口。// Just used as a divisorconst div string = " ---------------------------------"func test(data []byte) error {    var err error    // Creating the maps for the JSON data    m := map[string]interface{}{}    // Parsing/Unmarshalling the json readed from the file    err = json.Unmarshal(data, &m)    if err != nil {        log.Println("Error unmarshalling data: " + err.Error())        return err    }
查看完整描述

1 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

package main


import (

    "fmt"

    "time"

    "encoding/json"

)


var data = []byte(`{

    "error": [],

    "result": {

        "LINKUSD": {

            "asks": [

                ["2.049720", "183.556", 1576323009],

                ["2.049750", "555.125", 1576323009],

                ["2.049760", "393.580", 1576323008],

                ["2.049980", "206.514", 1576322995]

            ],

            "bids": [

                ["2.043800", "20.691", 1576322350],

                ["2.039080", "755.396", 1576323007],

                ["2.036960", "214.621", 1576323006],

                ["2.036930", "700.792", 1576322987]

            ]

        }

    }

}`)


type Response struct {

    Error  []interface{}          `json:"error"`

    Result map[string]Order `json:"result"`

}


type Order struct {

    Asks []BitfinexOrder `json:"asks"`

    Bids []BitfinexOrder `json:"bids"`

}


type BitfinexOrder struct {

    Price     string

    Volume    string

    Timestamp time.Time

}


// UnmarshalJSON decode a BifinexOrder.

func (b *BitfinexOrder) UnmarshalJSON(data []byte) error {

    var packedData []json.Number

    err := json.Unmarshal(data, &packedData)

    if err != nil {

        return err

    }

    b.Price = packedData[0].String()

    b.Volume = packedData[1].String()

    t, err := packedData[2].Int64()

    if err != nil {

        return err

    }

    b.Timestamp = time.Unix(t, 0)

    return nil

}


func main() {

    res := &Response{}

    if err := json.Unmarshal(data, res); err != nil {

        panic(err)

    }


    for key, value := range res.Result {

        fmt.Println(key)

        for i, ask := range value.Asks {

            fmt.Printf("Asks[%d] = %#v\n", i, ask)

        }

        for i, bid := range value.Bids {

            fmt.Printf("Bids[%d] = %#v\n", i, bid)

        }

    }

}


查看完整回答
反对 回复 2022-04-26
  • 1 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信