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

DDD
Release: 2024-11-06 11:31:02
Original
348 people have browsed it

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>
Copy after login

Using the following struct:

<code class="go">type Message struct {
    Asks [][]float64 `json:"Bids"`
    Bids [][]float64 `json:"Asks"`
}</code>
Copy after login

We can unmarshal the data as follows:

<code class="go">m := new(Message)
err := json.Unmarshal(b, &m)
if err != nil {
    // Handle error
}</code>
Copy after login

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>
Copy after login

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>
Copy after login

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>
Copy after login

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!

source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!