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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-07 05:58:03850ブラウズ

How to Customize JSON Unmarshaling into a Specific Struct 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>

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

JSON データをこの特殊な構造にアンマーシャリングするには、Order 構造体に json.Unmarshaler インターフェイスを実装できます。

<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 型が構造体 (オブジェクト) のデフォルト表現ではなく、float の 2 要素配列からデコードされる必要があることが指定されています。

使用例:

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

json.Unmarshaler を実装すると、特定のデータ構造要件に合わせてアンマーシャリング プロセスを簡単にカスタマイズできます。

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

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