Home > Article > Backend Development > How to Unmarshal Complex JSON Data into Nested Structures in Go?
In Go, unmarshaling JSON data into complex structs can sometimes require specialized handling. This article explores a scenario where the desired output format differs from the default representation for structs.
Consider the following JSON data:
<code class="json">b := []byte(`{"Asks": [[21, 1], [22, 1]] ,"Bids": [[20, 1], [19, 1]]}`)</code>
Using the following struct:
<code class="go">type Message struct { Asks [][]float64 `json:"Bids"` Bids [][]float64 `json:"Asks"` }</code>
We can unmarshal the data as follows:
<code class="go">m := new(Message) err := json.Unmarshal(b, &m) if err != nil { // Handle error }</code>
However, we would prefer to have the unmarshaled data in the following format:
<code class="go">type Message struct { Asks []Order `json:"Bids"` Bids []Order `json:"Asks"` } type Order struct { Price float64 Volume float64 }</code>
To achieve this, we can implement the json.Unmarshaler interface on our Order struct:
<code class="go">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 }</code>
This instructs the JSON decoder to treat Order as a 2-element array of floats rather than an object.
Now, we can unmarshal the JSON data and access the values as desired:
<code class="go">m := new(Message) err := json.Unmarshal(b, &m) if err != nil { // Handle error } fmt.Println(m.Asks[0].Price)</code>
The above is the detailed content of How to Unmarshal Complex JSON Data into Nested Structures in Go?. For more information, please follow other related articles on the PHP Chinese website!