2014-10-22 21 views
10

voglio unmarshalling i seguenti dati JSON in Golang:dati Unmarshal JSON in una struttura specifica in Go

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

so come fare, definisco una struttura come questa:

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

Quello che non so è se c'è un modo semplice per specializzare questo un po 'di più. Vorrei avere i dati dopo l'unmarshal in un formato simile a questo:

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

type Order struct { 
    Price float64 
    Volume float64 
} 

modo che io possa utilizzare in un secondo momento dopo unmarshalling in questo modo:

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

io non so davvero come per semplificare o farlo in modo idiomatico in GO quindi spero che ci sia una buona soluzione per questo.

+0

possibilmente correlati: http://stackoverflow.com/questions/21268000/unmarshaling-nested-json-objects-in-golang – rogerdpack

risposta

12

È possibile eseguire questa operazione implementando json.Unmarshaler interface nella struttura Order. Qualcosa di simile dovrebbe fare:

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 
} 

dice sostanzialmente che il tipo Order dovrebbe essere decodificato da una matrice 2 elemento di carri piuttosto che la rappresentazione predefinito per una struttura (un oggetto).

Si può giocare con questo esempio qui: http://play.golang.org/p/B35Of8H1e6

+0

Grazie per il vostro aiuto, questo era esattamente quello che stavo cercando. – ungchy

Problemi correlati