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 データをこの特殊な構造にアンマーシャリングするには、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 サイトの他の関連記事を参照してください。