In Go, unmarshaling JSON data into a struct is a common task. Consider the following JSON data:
<code class="json">{ "Asks": [[21, 1], [22, 1]], "Bids": [[20, 1], [19, 1]] }</code>
We can define a struct to represent this data:
<code class="go">type Message struct { Asks [][]float64 `json:"Asks"` Bids [][]float64 `json:"Bids"` }</code>
However, what if we want to further specialize the data structure, representing each order as an individual struct:
<code class="go">type Message struct { Asks []Order `json:"Asks"` Bids []Order `json:"Bids"` } 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">type Order struct { Price float64 Volume float64 } 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 method instructs Go to decode each element in the JSON as a 2-element array and assigns the values to the Price and Volume fields of the Order struct.
After implementing this method, we can now unmarshal the JSON data into our custom struct:
<code class="go">jsonBlob := []byte(`{"Asks": [[21, 1], [22, 1]], "Bids": [[20, 1], [19, 1]]}`) message := &Message{} if err := json.Unmarshal(jsonBlob, message); err != nil { panic(err) }</code>
Now, we can access the data using the custom Order struct:
<code class="go">fmt.Println(message.Asks[0].Price)</code>
The above is the detailed content of How to Unmarshal JSON Data into a Custom Struct with Specialized Substructures in Go?. For more information, please follow other related articles on the PHP Chinese website!