ホームページ  >  記事  >  バックエンド開発  >  Go で JSON データの特定の構造体へのアンマーシャリングをカスタマイズするにはどうすればよいですか?

Go で JSON データの特定の構造体へのアンマーシャリングをカスタマイズするにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-06 19:38:02300ブラウズ

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

JSON データの特定の構造体へのカスタマイズされたアンマーシャリング

Go では、事前定義された構造体への JSON データのアンマーシャリングは一般的なタスクです。ただし、非マーシャリングされたデータ構造をさらにカスタマイズする必要がある場合、このプロセスはより複雑になる可能性があります。この記事では、アンマーシャリング プロセスを特定の要件に合わせて調整するアプローチについて説明します。

次の JSON データについて考えてみましょう:

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

最初のアプローチでは、Asks と 2 つのフィールドを持つ構造体 Message を定義しました。それぞれのビッドにはフロートの配列が含まれます。ただし、これらの配列に単純な浮動小数点の代わりに Order 型の構造体が含まれる、より特殊な構造を求めます。必要なデータ構造は次のようになります。

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

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

このカスタマイズを実現するには、Go の json.Unmarshaler インターフェイスを利用できます。このインターフェイスを Order 構造体に実装することで、JSON 配列要素を Order 構造体に変換するカスタム アンマーシャリング ロジックを提供します。

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

この実装では、Order 型を 2 要素の配列からデコードする必要があることを指定します。最初の要素は価格を表し、2 番目の要素は出来高を表します。

このカスタム アンマーシャリング ロジックを使用すると、JSON データを目的の構造体メッセージに効果的にアンマーシャリングできるようになります。

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

カスタム UnmarshalJSON 実装を使用すると、このコードは最初の売り注文の価格を出力します。このカスタマイズされたアンマーシャリング アプローチは、Go の特定の要件に合わせてデータのアンマーシャリングを調整する柔軟な方法を提供します。

以上がGo で JSON データの特定の構造体へのアンマーシャリングをカスタマイズするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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