Home  >  Article  >  Backend Development  >  How to Unmarshal Complex JSON Data into Nested Structures in Go?

How to Unmarshal Complex JSON Data into Nested Structures in Go?

DDD
DDDOriginal
2024-11-06 11:31:02338browse

How to Unmarshal Complex JSON Data into Nested Structures in Go?

Unmarshal Complex JSON Data into Nested Structures

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.

The Problem

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>

The Solution

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.

Usage

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!

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