2014-10-22 19 views
10

Chcę unmarshal następujące dane JSON w Golang:dane unmarshal JSON w konkretnej struktury w Go

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

wiem jak to zrobić, i zdefiniować struct tak:

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

Nie wiem, czy istnieje prosty sposób na specjalizację . chciałbym mieć dane po unmarshaling w formacie jak poniżej:

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

type Order struct { 
    Price float64 
    Volume float64 
} 

tak, że można używać go później po unmarshaling tak:

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

ja naprawdę nie wiem jak łatwo lub idiomatycznie zrobić to w GO , więc mam nadzieję, że jest na to dobre rozwiązanie.

+0

ewentualnie powiązanych: http://stackoverflow.com/questions/21268000/unmarshaling-nested-json-objects-in-golang – rogerdpack

Odpowiedz

12

Możesz to zrobić, implementując json.Unmarshaler interface na swojej strukturze Order. Coś jak to powinno zrobić:

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 
} 

To w zasadzie mówi, że typ Order powinny być dekodowane z tablicy 2 elementu pływaków zamiast domyślnej reprezentacji do struct (AN obiektu).

Możesz poeksperymentować z tym przykład tutaj: http://play.golang.org/p/B35Of8H1e6

+0

Dziękuję za pomoc, to było dokładnie to, czego szukałem. – ungchy