Home  >  Article  >  Backend Development  >  How to Customize Unmarshaling of JSON Data into Specific Structs in Go?

How to Customize Unmarshaling of JSON Data into Specific Structs in Go?

DDD
DDDOriginal
2024-11-06 19:38:02300browse

How to Customize Unmarshaling of JSON Data into Specific Structs in Go?

Customized Unmarshaling of JSON Data into Specific Structs

In Go, unmarshaling JSON data into predefined structs is a common task. However, this process can become more complex when you need to further customize the unmarshaled data structure. This article explores an approach to tailor the unmarshaling process to specific requirements.

Let's consider the following JSON data:

<code class="json">b := []byte(`{"Asks": [[21, 1], [22, 1]] ,"Bids": [[20, 1], [19, 1]]}`)</code>

Your initial approach involved defining a struct Message with two fields, Asks and Bids, each holding an array of floats. However, you seek a more specialized structure where these arrays contain structs of type Order instead of simple floats. The desired data structure looks like:

<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 customization, we can leverage Go's json.Unmarshaler interface. By implementing this interface on the Order struct, we provide a custom unmarshaling logic that converts the JSON array elements into Order structs.

<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 implementation specifies that the Order type should be decoded from a 2-element array of floats, where the first element represents the price and the second element represents the volume.

Using this custom unmarshaling logic, you can now effectively unmarshal the JSON data into the desired struct Message.

<code class="go">m := new(Message)
err := json.Unmarshal(b, &m)
fmt.Println(m.Asks[0].Price)</code>

With the custom UnmarshalJSON implementation, this code will print the price of the first ask order. This customized unmarshaling approach provides a flexible way to tailor data unmarshaling to specific requirements in Go.

The above is the detailed content of How to Customize Unmarshaling of JSON Data into Specific Structs in Go?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn