ホームページ  >  記事  >  バックエンド開発  >  Go で JSON データを特殊な下部構造を持つカスタム構造体にアンマーシャリングする方法

Go で JSON データを特殊な下部構造を持つカスタム構造体にアンマーシャリングする方法

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-06 14:27:02882ブラウズ

How to Unmarshal JSON Data into a Custom Struct with Specialized Substructures in Go?

JSON データをカスタム構造体にアンマーシャリングする

Go では、JSON データを構造体にアンマーシャリングするのは一般的なタスクです。次の JSON データについて考えてみましょう:

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

このデータを表す構造体を定義できます:

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

ただし、各注文を表すデータ構造をさらに特殊化したい場合はどうなるでしょうか。個別の構造体として:

<code class="go">type Message struct {
    Asks []Order `json:"Asks"`
    Bids []Order `json:"Bids"`
}

type Order struct {
    Price float64
    Volume float64
}</code>

MarshalJSON を使用したカスタム アンマーシャリング

これを実現するには、Order 構造体に json.Unmarshaler インターフェイスを実装できます:

<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>

このメソッドは、JSON 内の各要素を 2 要素の配列としてデコードし、その値を Order 構造体の Price フィールドと Volume フィールドに割り当てるように Go に指示します。

このメソッドを実装した後、JSON データをアンマーシャリングできるようになります。カスタム構造体に追加します:

<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>

これで、カスタム Order 構造体を使用してデータにアクセスできるようになります:

<code class="go">fmt.Println(message.Asks[0].Price)</code>

以上がGo で JSON データを特殊な下部構造を持つカスタム構造体にアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。