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

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

Linda Hamilton
リリース: 2024-11-07 05:58:03
オリジナル
882 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート