解组没有键的嵌套 json

我无法在从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 divisor

const 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

    }



慕尼黑5688855
浏览 116回答 1
1回答

杨__羊羊

package mainimport (    "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)        }    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go