Unmarshal Json данные в определенной структуре

Я хочу разархивировать следующие данные JSON в Go:

b := []byte('{"Asks": [[21, 1], [22, 1]] ,"Bids": [[20, 1], [19, 1]]}')

Я знаю, как это сделать, я определяю такую структуру:

type Message struct {
    Asks [][]float64 'json:"Bids"'
    Bids [][]float64 'json:"Asks"'
}

То, что я не знаю, есть ли простой способ специализировать это немного больше. Я хотел бы получить данные после демаршалинга в таком формате:

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

type Order struct {
    Price float64
    Volume float64
}

Так что я смогу использовать его позже после демаршалинга следующим образом:

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

Я действительно не знаю, как легко или идиоматически сделать это в GO, поэтому я надеюсь, что есть хорошее решение для этого.

Ответ 1

Вы можете сделать это, реализовав json.Unmarshaler interface в своей структуре 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
}

В основном это говорит о том, что тип Order должен быть декодирован из массива из 2 элементов float, а не по умолчанию для структуры (объекта).

Вы можете поиграть с этим примером здесь: http://play.golang.org/p/B35Of8H1e6