在Go中的特定结构中解组Json数据

ung*_*chy 12 json struct go

我想在Golang中解组以下JSON数据:

b := []byte(`{"Asks": [[21, 1], [22, 1]] ,"Bids": [[20, 1], [19, 1]]}`)
Run Code Online (Sandbox Code Playgroud)

我知道如何做到这一点,我定义了这样的结构:

type Message struct {
    Asks [][]float64 `json:"Bids"`
    Bids [][]float64 `json:"Asks"`
}
Run Code Online (Sandbox Code Playgroud)

我不知道的是,是否有一种简单的方法可以将这一点专门化.我希望在解组之后以这样的格式获取数据:

type Message struct {
    Asks []Order `json:"Bids"`
    Bids []Order `json:"Asks"`
}

type Order struct {
    Price float64
    Volume float64
}
Run Code Online (Sandbox Code Playgroud)

所以我可以在解组之后再使用它:

m := new(Message)
err := json.Unmarshal(b, &m)
fmt.Println(m.Asks[0].Price)
Run Code Online (Sandbox Code Playgroud)

我真的不知道在GO中如何轻松或惯用,所以我希望有一个很好的解决方案.

Jam*_*dge 18

您可以通过在结构上实现json.Unmarshaler接口来实现此目的Order.这样的事情应该做:

func (o *Order) UnmarshalJSON(data []byte) error {
    var v [2]float64
    if err := json.Unmarshal(data, &v); err != nil {
        return err
    }
    o.Price = v[0]
    o.Volume = v[1]
    return nil
}
Run Code Online (Sandbox Code Playgroud)

这基本上说Order应该从2元素的浮点数组中解码,而不是结构(对象)的默认表示.

你可以在这里玩这个例子:http://play.golang.org/p/B35Of8H1e6