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