我得到以下数据:
{
"timestamp": "1526058949",
"bids": [
[
"7215.90",
"2.31930000"
],
[
"7215.77",
"1.00000000"
]
]
}
通过websocket,我想将其解组为
type OrderBookItem struct {
Price string
Amount string
}
type OrderBookResult struct {
Timestamp string `json:"timestamp"`
Bids []OrderBookItem `json:"bids"`
Asks []OrderBookItem `json:"asks"`
}
用以下内容解组:
s := e.Data.(string)
d := &OrderBookResult{}
err := json.Unmarshal([]byte(s), d)
if err == nil {
....
} else {
fmt.Println(err.Error())
}
但我一直收到错误:
json:无法将字符串解组为Go struct字段 Order.OrderBookItem
类型的OrderBookResult.bids
当我将结构改为
时type OrderBookResult struct {
Timestamp string `json:"timestamp"`
Bids [][]string `json:"bids"`
Asks [][]string `json:"asks"`
}
它有效。我希望将它们定义为float64
,它们就是这样。我需要改变什么?
答案 0 :(得分:3)
正如错误所说:
json:无法将字符串解组为Go struct字段 Order.OrderBookItem
类型的OrderBookResult.bids
我们无法将OrderBookResult.bids(它是一个字符串片段)转换为OrderBookItem,即struct
实施UnmarshalJSON
接口,将数组转换为price
和amount
结构的OrderBookItem
对象。如下所示
package main
import (
"fmt"
"encoding/json"
)
type OrderBookItem struct {
Price string
Amount string
}
func(item *OrderBookItem) UnmarshalJSON(data []byte)error{
var v []string
if err:= json.Unmarshal(data, &v);err!=nil{
fmt.Println(err)
return err
}
item.Price = v[0]
item.Amount = v[1]
return nil
}
type OrderBookResult struct {
Timestamp string `json:"timestamp"`
Bids []OrderBookItem `json:"bids"`
Asks []OrderBookItem `json:"asks"`
}
func main() {
var result OrderBookResult
jsonString := []byte(`{"timestamp": "1526058949", "bids": [["7215.90", "2.31930000"], ["7215.77", "1.00000000"]]}`)
if err := json.Unmarshal([]byte(jsonString), &result); err != nil{
fmt.Println(err)
}
fmt.Printf("%+v", result)
}
有关更多信息,请阅读Unmarshaler
的GoLang规范答案 1 :(得分:2)
您将出价视为两个单独字符串的结构,而它们实际上是JSON中的一小部分字符串。如果您将OrderBookItem更改为
type OrderBookItem []string
这是你在第二位中定义它们的方式,它有效。
要访问您必须执行的值: 价格:= d.Bids [0] 金额:= d.Bids [1]