繁体   English   中英

golang json数组解组为struct类型

[英]golang json array unmarshal into type struct

是什么导致这不分解json? 任何人都有关于类型错误的想法吗?

错误为:

{“ Rates”:[{“ Symbol”:“ EURAUD”,“ Bid”:“ 1.45492”,“ Ask”:“ 1.45608”,“ Spread”:“ 11.60”,“ ProductType”:“ 1”,},{ “ Symbol”:“ Copper”,“ Bid”:“ 2.6068”,“ Ask”:“ 2.6088”,“ Spread”:“ 2.00”,“ ProductType”:“ 3”,},{“ Symbol”:“ AUDNZD” ,“出价”:“ 1.08999”,“询问”:“ 1.09177”,“点差”:“ 17.80”,“产品类型”:“ 1”,},{“符号”:“ EURSEK”,“出价”:“ 9.63786 “,” Ask“:” 9.65569“,” Spread“:” 178.30“,” ProductType“:” 1“,},{” Symbol“:” CADJPY“,” Bid“:” 81.629“,” Ask“:” 81.708“,” Spread“:” 7.90“,” ProductType“:” 1“,},{” Symbol“:” USDCHF“,” Bid“:” 0.99463“,” Ask“:” 0.99527“,” Spread“: “ 6.40”,“ ProductType”:“ 1”,},{“ Symbol”:“ USDCNH”,“ Bid”:“ 6.8973”,“ Ask”:“ 6.8993”,“ Spread”:“ 20.00”,“ ProductType” :“ 1”,},{“ Symbol”:“ US30”,“ Bid”:“ 20950.00”,“ Ask”:“ 20952.00”,“ Spread”:“ 2.00”,“ ProductType”:“ 2”,}, {“ Symbol”:“ XAGUSD”,“ Bid”:“ 17.202”,“ Ask”:“ 17.25”,“ Spread”:“ 4.80”,“ ProductType”:“ 5”,},{“ Symbol”:“ USDSEK “,”出价“:” 8.84794“,”询问“:” 8.85542“,”点差“:” 74.80“,”产品类型“:” 1“,},{”符号“:” AUDCHF“,”出价“:” 0.74417“,”询问“:” 0.74588“,”点差“:” 17.10“,”产品类型“:” 1“,},{”符号“:” GER30“,”出价“:” 12431.05“, “ Ask”:“ 12433.45”,“ Spread”:“ 2.40”,“ ProductType”:“ 2”,},{“ Symbol”:“ USOil”,“ Bid”:“ 49.16”,“ Ask”:“ 49.21” ,“ Spread”:“ 5.00”,“ ProductType”:“ 3”,},{“ Symbol”:“ GBPNZD”,“ Bid”:“ 1.88546”,“ Ask”:“ 1.88762”,“ Spread”:“ 21.60 “,” ProductType“:” 1“,},{” Symbol“:” EURCAD“,” Bid“:” 1.48748“,” Ask“:” 1.48893“,” Spread“:” 14.50“,” ProductType“:” 1“,},{” Symbol“:” EURUSD“,” Bid“:” 1.08977“,” Ask“:” 1.08997“,” Spread“:” 2.00“,” ProductType“:” 1“,},{” Symbol“:” AUS200“,” Bid“:” 5922.00“,” Ask“:” 5924.00“,” Spread“:” 2.00“,” ProductType“:” 2“,},{” Symbol“:” EURJPY“, “出价”:“ 121.512”,“询问”:“ 121.57”,“点差”:“ 5.80”,“产品类型”:“ 1”,},{“符号”:“ EURGBP”,“出价”:“ 0.84132” ,“询问”:“ 0.84208”,“传播”:“ 7.60”,“产品类型”:“ 1”,},{“符号”:“ EURNOK”,“出价”:“ 9.34136”,“询问”:“ 9.36364 “,” Spread“:” 222.80“,” ProductType“:” 1“,},{” Symbol“:” USDCAD“,” Bid“:” 1.36524“,” Ask“:” 1.36588“,” Spread“:” 6.40“,” ProductType“:” 1“,},{” Symbol“:” GBPCHF“,” Bid“:” 1.28753“,” Ask“:” 1.28922“,” Spread“:” 16.90“,” ProductType“: “ 1”,},{“ Symbol”:“ GBPAUD”,“ Bid”:“ 1.72838”,“ Ask”:“ 1.7303”,“ Spread”:“ 19.20”,“ ProductTyp e“:” 1“,},{” Symbol“:” USDJPY“,” Bid“:” 111.51“,” Ask“:” 111.537“,” Spread“:” 2.70“,” ProductType“:” 1“, },{“ Symbol”:“ USDNOK”,“ Bid”:“ 8.57607”,“ Ask”:“ 8.58684”,“ Spread”:“ 107.70”,“ ProductType”:“ 1”,},{“ Symbol”: “ AUDCAD”,“出价”:“ 1.02173”,“询问”:“ 1.02347”,“点差”:“ 17.40”,“产品类型”:“ 1”,},{“符号”:“ FRA40”,“出价” :“ 5259.60”,“询问”:“ 5267.30”,“点差”:“ 7.70”,“产品类型”:“ 2”,},{“符号”:“ AUDUSD”,“出价”:“ 0.74858”,“询问“:” 0.74899“,”价差“:” 4.10“,”产品类型“:” 1“,},{”符号“:” USDHKD“,”出价“:” 7.77769“,”询问“:” 7.77956“,” Spread“:” 18.70“,” ProductType“:” 1“,},{” Symbol“:” NZDCHF“,” Bid“:” 0.68192“,” Ask“:” 0.68406“,” Spread“:” 21.40“, “ ProductType”:“ 1”,},{“ Symbol”:“ EURTRY”,“ Bid”:“ 3.86851”,“ Ask”:“ 3.87478”,“ Spread”:“ 62.70”,“ ProductType”:“ 1” ,},{“ Symbol”:“ AUDJPY”,“ Bid”:“ 83.469”,“ Ask”:“ 83.543”,“ Spread”:“ 7.40”,“ ProductType”:“ 1”,},{“ Symbol” :“ USDZAR”,“ Bid”:“ 13.3464”,“ Ask”:“ 13.3941”,“ Spread”:“ 477.00”,“ ProductType”:“ 1”,},{“ Symbol”:“ Bund”,“ Bid “:” 161.78“,”询问“:” 161.81“,”价差“:” 3.00“,”产品类型“:” 4“,},{”符号“:” USDMXN“,”出价“:” 18.81249 “,” Ask“:” 18.83178“,” Spread“:” 192.90“,” ProductType“:” 1“,},{” Symbol“:” USDTRY“,” Bid“:” 3.54925“,” Ask“:” 3.5536“,” Spread“:” 43.50“,” ProductType“:” 1“,},{” Symbol“:” USDOLLAR“,” Bid“:” 12232.00“,” Ask“:” 12237.00“,” Spread“: “ 5.00”,“ ProductType”:“ 7”,},{“ Symbol”:“ JPN225”,“ Bid”:“ 19195.00”,“ Ask”:“ 19205.00”,“ Spread”:“ 10.00”,“ ProductType” :“ 2”,},{“ Symbol”:“ UK100”,“ Bid”:“ 7197.80”,“ Ask”:“ 7198.90”,“ Spread”:“ 1.10”,“ ProductType”:“ 2”,}, {“ Symbol”:“ HKG33”,“ Bid”:“ 24650.00”,“ Ask”:“ 24655.00”,“ Spread”:“ 5.00”,“ ProductType”:“ 2”,},{“ Symbol”:“ CADCHF “,”出价“:” 0.72748“,”询问“:” 0.72979“,”点差“:” 23.10“,”产品类型“:” 1“,},{”符号“:” NAS100“,”出价“:” 5582.80“,”询问“:” 5583.80“,”点差“:” 1.00“,”产品类型“:” 2“,},{”符号“:” NGAS“,”出价“:” 3.2645“,”询问“: “ 3.2755”,“价差”:“ 11.00”,“产品类型”:“ 3”,},{“符号”:“ ZARJPY”,“出价”:“ 8.323”,“询问”:“ 8.361”,“价差” :“ 3.80”,“ ProductType”:“ 1”,},{“ Symbol”:“ GBPCAD”,“ Bid”:“ 1.76724”,“ Ask”:“ 1.76912”,“ Spread”:“ 18.80”,“ ProductType “:” 1“,},{” Symbol“:” ESP35“,” Bid“:” 10712.00“,” Ask“:” 10720.00“,” Spread“:” 8.00“,” Pr oductType“:” 2“,},{” Symbol“:” GBPUSD“,” Bid“:” 1.29452“,” Ask“:” 1.29527“,” Spread“:” 7.50“,” ProductType“:” 1“, },{“ Symbol”:“ SPX500”,“ Bid”:“ 2384.18”,“ Ask”:“ 2384.68”,“ Spread”:“ 5.00”,“ ProductType”:“ 2”,},{“ Symbol”: “ GBPJPY”,“出价”:“ 144.336”,“询问”:“ 144.448”,“点差”:“ 11.20”,“产品类型”:“ 1”,},{“符号”:“ EUSTX50”,“出价” :“ 3554.00”,“询问”:“ 3555.00”,“点差”:“ 1.00”,“产品类型”:“ 2”,},{“符号”:“ TRYJPY”,“出价”:“ 31.378”,“询问“:” 31.44“,” Spread“:” 6.20“,” ProductType“:” 1“,},{” Symbol“:” NZDCAD“,” Bid“:” 0.93642“,” Ask“:” 0.93862“,” Spread“:” 22.00“,” ProductType“:” 1“,},{” Symbol“:” EURNZD“,” Bid“:” 1.58644“,” Ask“:” 1.58916“,” Spread“:” 27.20“, “ ProductType”:“ 1”,},{“ Symbol”:“ XAUUSD”,“ Bid”:“ 1267.79”,“ Ask”:“ 1268.26”,“ Spread”:“ 47.00”,“ ProductType”:“ 5” ,},{“ Symbol”:“ NZDUSD”,“ Bid”:“ 0.68587”,“ Ask”:“ 0.68692”,“ Spread”:“ 10.50”,“ ProductType”:“ 1”,},{“ Symbol” :“ NZDJPY”,“出价”:“ 76.489”,“询问”:“ 76.607”,“点差”:“ 11.80”,“产品类型”:“ 1”,},{“符号”:“ UKOil”,“出价“:” 51.84“,”询问“:” 51.89“,”价差“:” 5.00“,”产品类型“:” 3“,},{”符号“:” CHFJPY“,”出价“:” 112 .02“,” Ask“:” 112.148“,” Spread“:” 12.80“,” ProductType“:” 1“,},{” Symbol“:” EURCHF“,” Bid“:” 1.08416“,” Ask“ :“ 1.08459”,“价差”:“ 4.30”,“产品类型”:“ 1”,}]} {“费率”:[{“符号”:“ EURAUD”,“出价”:“ 1.45492”,“询问” :“ 1.45608”,“价差”:“ 11.60”,“产品类型”:“ 1”},{“符号”:“铜”,“出价”:“ 2.6068”,“询问”:“ 2.6088”,“价差” :“ 2.00”,“ ProductType”:“ 3”},{“ Symbol”:“ AUDNZD”,“ Bid”:“ 1.08999”,“ Ask”:“ 1.09177”,“ Spread”:“ 17.80”,“ ProductType” :“ 1”},{“ Symbol”:“ EURSEK”,“ Bid”:“ 9.63786”,“ Ask”:“ 9.65569”,“ Spread”:“ 178.30”,“ ProductType”:“ 1”},{“ Symbol“:” CADJPY“,” Bid“:” 81.629“,” Ask“:” 81.708“,” Spread“:” 7.90“,” ProductType“:” 1“},{” Symbol“:” USDCHF“,”出价“:” 0.99463“,”问价“:” 0.99527“,”价差“:” 6.40“,”产品类型“:” 1“},{”符号“:” USDCNH“,”出价“:” 6.8973“,”询问“:” 6.8993“,”价差“:” 20.00“,”产品类型“:” 1“},{”符号“:” US30“,”出价“:” 20950.00“,”询问“:” 20952.00“,” Spread“:” 2.00“,” ProductType“:” 2“},{” Symbol“:” XAGUSD“,” Bid“:” 17.202“,” Ask“:” 17.25“,” Spread“:” 4.80“,” ProductType“:” 5“},{” Symbol“:” USDSEK“,” Bid“:” 8.84794“,” Ask“:” 8.85542“,” Spread“:” 74.80“,” Prod uctType“:” 1“},{” Symbol“:” AUDCHF“,” Bid“:” 0.74417“,” Ask“:” 0.74588“,” Spread“:” 17.10“,” ProductType“:” 1“}, {“ Symbol”:“ GER30”,“ Bid”:“ 12431.05”,“ Ask”:“ 12433.45”,“ Spread”:“ 2.40”,“ ProductType”:“ 2”},{“ Symbol”:“ USOil” ,“出价”:“ 49.16”,“询问”:“ 49.21”,“点差”:“ 5.00”,“产品类型”:“ 3”},{“符号”:“ GBPNZD”,“出价”:“ 1.88546” ,“询问”:“ 1.88762”,“点差”:“ 21.60”,“产品类型”:“ 1”},{“符号”:“ EURCAD”,“出价”:“ 1.48748”,“询问”:“ 1.48893” ,“价差”:“ 14.50”,“产品类型”:“ 1”},{“符号”:“ EURUSD”,“出价”:“ 1.08977”,“询问”:“ 1.08997”,“价差”:“ 2.00” ,“ ProductType”:“ 1”},{“ Symbol”:“ AUS200”,“ Bid”:“ 5922.00”,“ Ask”:“ 5924.00”,“ Spread”:“ 2.00”,“ ProductType”:“ 2” },{“ Symbol”:“ EURJPY”,“ Bid”:“ 121.512”,“ Ask”:“ 121.57”,“ Spread”:“ 5.80”,“ ProductType”:“ 1”},{“ Symbol”:“ EURGBP“,”出价“:” 0.84132“,”询问“:” 0.84208“,”点差“:” 7.60“,”产品类型“:” 1“},{”符号“:” EURNOK“,”出价“:” 9.34136“,”询问“:” 9.36364“,”点差“:” 222.80“,”产品类型“:” 1“},{”符号“:” USDCAD“,”出价“:” 1.36524“,”询问“:” 1.36588“,” Spread“:” 6.40“,” ProductType“:” 1“},{” Symbol“:” GBPCHF“,” Bid“:” 1.28753“,” Ask“ :“ 1.28922”,“价差”:“ 16.90”,“产品类型”:“ 1”},{“符号”:“ GBPAUD”,“出价”:“ 1.72838”,“询问”:“ 1.7303”,“价差” :“ 19.20”,“ ProductType”:“ 1”},{“ Symbol”:“ USDJPY”,“ Bid”:“ 111.51”,“ Ask”:“ 111.537”,“ Spread”:“ 2.70”,“ ProductType” :“ 1”},{“ Symbol”:“ USDNOK”,“ Bid”:“ 8.57607”,“ Ask”:“ 8.58684”,“ Spread”:“ 107.70”,“ ProductType”:“ 1”},{“符号“:” AUDCAD“,”出价“:” 1.02173“,”询问“:” 1.02347“,”点差“:” 17.40“,”产品类型“:” 1“},{”符号“:” FRA40“,”出价”:“ 5259.60”,“询问”:“ 5267.30”,“点差”:“ 7.70”,“产品类型”:“ 2”},{“符号”:“ AUDUSD”,“出价”:“ 0.74858”,“询问“:” 0.74899“,”价差“:” 4.10“,”产品类型“:” 1“},{”符号“:” USDHKD“,”出价“:” 7.77769“,”询问“:” 7.77956“,” Spread“:” 18.70“,” ProductType“:” 1“},{” Symbol“:” NZDCHF“,” Bid“:” 0.68192“,” Ask“:” 0.68406“,” Spread“:” 21.40“,” ProductType“:” 1“},{” Symbol“:” EURTRY“,” Bid“:” 3.86851“,” Ask“:” 3.87478“,” Spread“:” 62.70“,” ProductType“:” 1“}, {“ Symbol”:“ AUDJPY”,“ Bid”:“ 83.469”,“ Ask”:“ 83.543”,“ Spread”:“ 7.40”,“ ProductType”:“ 1”},{“ Symbol”:“ USDZAR” ,“出价”:“ 13.3464”,“询问”:“ 13.3941”,“价差”:“ 477.00”,“产品类型”:“ 1”},{“ S ymbol“:” Bund“,” Bid“:” 161.78“,” Ask“:” 161.81“,” Spread“:” 3.00“,” ProductType“:” 4“},{” Symbol“:” USDMXN“,”出价“:” 18.81249“,”问价“:” 18.83178“,”价差“:” 192.90“,”产品类型“:” 1“},{”符号“:” USDTRY“,”出价“:” 3.54925“,”询问“:” 3.5536“,”价差“:” 43.50“,”产品类型“:” 1“},{”符号“:” USDOLLAR“,”出价“:” 12232.00“,”询问“:” 12237.00“,” Spread“:” 5.00“,” ProductType“:” 7“},{” Symbol“:” JPN225“,” Bid“:” 19195.00“,” Ask“:” 19205.00“,” Spread“:” 10.00“,” ProductType“:” 2“},{” Symbol“:” UK100“,” Bid“:” 7197.80“,” Ask“:” 7198.90“,” Spread“:” 1.10“,” ProductType“:” 2“}, {“ Symbol”:“ HKG33”,“ Bid”:“ 24650.00”,“ Ask”:“ 24655.00”,“ Spread”:“ 5.00”,“ ProductType”:“ 2”},{“ Symbol”:“ CADCHF” ,“出价”:“ 0.72748”,“询问”:“ 0.72979”,“传播”:“ 23.10”,“产品类型”:“ 1”},{“符号”:“ NAS100”,“出价”:“ 5582.80” ,“问”:“ 5583.80”,“点差”:“ 1.00”,“产品类型”:“ 2”},{“符号”:“ NGAS”,“出价”:“ 3.2645”,“问”:“ 3.2755” ,“ Spread”:“ 11.00”,“ ProductType”:“ 3”},{“ Symbol”:“ ZARJPY”,“ Bid”:“ 8.323”,“ Ask”:“ 8.361”,“ Spread”:“ 3.80” ,“ ProductType”:“ 1”},{“ Symbol”:“ GBPCAD”,“ Bid”:“ 1.76724”,“ Ask”:“ 1.76912”,“ Spre ad“:” 18.80“,” ProductType“:” 1“},{” Symbol“:” ESP35“,” Bid“:” 10712.00“,” Ask“:” 10720.00“,” Spread“:” 8.00“,” ProductType“:” 2“},{” Symbol“:” GBPUSD“,” Bid“:” 1.29452“,” Ask“:” 1.29527“,” Spread“:” 7.50“,” ProductType“:” 1“}, {“ Symbol”:“ SPX500”,“ Bid”:“ 2384.18”,“ Ask”:“ 2384.68”,“ Spread”:“ 5.00”,“ ProductType”:“ 2”},{“ Symbol”:“ GBPJPY” ,“出价”:“ 144.336”,“询问”:“ 144.448”,“价差”:“ 11.20”,“产品类型”:“ 1”},{“符号”:“ EUSTX50”,“出价”:“ 3554.00” ,“问”:“ 3555.00”,“点差”:“ 1.00”,“产品类型”:“ 2”},{“符号”:“ TRYJPY”,“出价”:“ 31.378”,“问”:“ 31.44” ,“ Spread”:“ 6.20”,“ ProductType”:“ 1”},{“ Symbol”:“ NZDCAD”,“ Bid”:“ 0.93642”,“ Ask”:“ 0.93862”,“ Spread”:“ 22.00” ,“ ProductType”:“ 1”},{“ Symbol”:“ EURNZD”,“ Bid”:“ 1.58644”,“ Ask”:“ 1.58916”,“ Spread”:“ 27.20”,“ ProductType”:“ 1” },{“ Symbol”:“ XAUUSD”,“ Bid”:“ 1267.79”,“ Ask”:“ 1268.26”,“ Spread”:“ 47.00”,“ ProductType”:“ 5”},{“ Symbol”:“ NZDUSD“,”出价“:” 0.68587“,”询问“:” 0.68692“,”点差“:” 10.50“,” ProductType“:” 1“},{” Symbol“:” NZDJPY“,” Bid“:” 76.489“,” Ask“:” 76.607“,” Spread“:” 11.80“,” ProductType“:” 1“},{” Symbol“:” UKOil“,” B id“:” 51.84“,” Ask“:” 51.89“,” Spread“:” 5.00“,” ProductType“:” 3“},{” Symbol“:” CHFJPY“,” Bid“:” 112.02“,”询问“:” 112.148“,”传播“:” 12.80“,”产品类型“:” 1“},{”符号“:” EURCHF“,”出价“:” 1.08416“,”询问“:” 1.08459“,” Spread“:” 4.30“,” ProductType“:” 1“}]}

panic:json:无法将字符串解组为main.MsgRatesArray类型的Go值

goroutine 1 [正在运行]:

main.main()

  /tmp/test.go:50 +0x52c 

使用此代码:

package main

import (
        "log"
        "fmt"
        "net/http"
        "bytes"
        "io/ioutil"
        "strings"
        "github.com/pquerna/ffjson/ffjson"
)


type MsgRatesArray struct {
        RateQuote []MsgRateQuoteJson `json:"Rates"`
}
type MsgRateQuoteJson struct {
        SymbolName string `json:"Symbol"`
        SymbolBid int64 `json:"Bid"`
        SymbolAsk int64 `json:"Ask"`
        SymbolSpread int64 `json:"Spread"`
        SymbolPT string `json:"ProductType"`
}

var respBytes []byte

func main() {
    var msg MsgRatesArray
    response,err := http.Get("https://ratesjson.fxcm.com/DataDisplayer")
    if err != nil {
        log.Fatal(err)
    }
    defer response.Body.Close()
    respBytes, err := ioutil.ReadAll(response.Body)
    //Get bad JSON into string
    jsonBytes := respBytes[bytes.Index(respBytes, []byte("{")):bytes.LastIndex(respBytes, []byte("}"))+1]
    jsonString := string(jsonBytes)
    fmt.Println(jsonString)
    // Use a positive number to indicate max replacement count to fix bad JSON string so we can remove comma in JSON ARRAY.
    result := strings.Replace(jsonString, "\",}", "\"}", -1)
    fmt.Println(result)
    // Turn GOOD JSON string back to JSON BYTES (BIN)
    jsonBytes2, err := ffjson.Marshal(result)
    if err != nil {
        panic(err)
    }
    // Parse JSON !
    err = ffjson.Unmarshal(jsonBytes2, &msg)
    if err != nil {
        panic(err)
    }
}

json数组的类型有什么问题?

在返回的json BidAskSpread是json字符串而不是整数,因此将类型定义更改为:

type MsgRateQuoteJson struct {
    SymbolName   string `json:"Symbol"`
    SymbolBid    string `json:"Bid"`
    SymbolAsk    string `json:"Ask"`
    SymbolSpread string `json:"Spread"`
    SymbolPT     string `json:"ProductType"`
}

封送json字符串以获取json字节不是正确的方法,只需将字符串转换为如下所示的字节片:

jsonBytes2 := []byte(result)

...而且您很高兴:

// Parse JSON !
err = ffjson.Unmarshal(jsonBytes2, &msg)
if err != nil {
    panic(err)
}

编辑

如果要在json解组期间将这些字符串转换为特定类型,可以通过在*MsgRateQuoteJson类型上定义UnmarshalJSON方法,并借助strconv包来实现,例如:

type MsgRateQuoteJson struct {
    SymbolName   string  `json:"Symbol"`
    SymbolBid    float64 `json:"Bid"`
    SymbolAsk    float64 `json:"Ask"`
    SymbolSpread float64 `json:"Spread"`
    SymbolPT     int64   `json:"ProductType"`
}

func (msg *MsgRateQuoteJson) UnmarshalJSON(data []byte) (err error) {
    m := map[string]string{}
    if err = ffjson.Unmarshal(data, &m); err != nil {
        return err
    }

    msg.SymbolName = m["Symbol"]
    if msg.SymbolBid, err = strconv.ParseFloat(m["Bid"], 64); err != nil {
        return err
    }
    if msg.SymbolAsk, err = strconv.ParseFloat(m["Ask"], 64); err != nil {
        return err
    }
    if msg.SymbolSpread, err = strconv.ParseFloat(m["Spread"], 64); err != nil {
        return err
    }
    if msg.SymbolPT, err = strconv.ParseInt(m["ProductType"], 10, 64); err != nil {
        return err
    }
    return nil
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM