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