
構造体をスライスのマップにアンマーシャリングする
Go では、デフォルトのアンマーシャリング動作が十分でない場合にカスタム アンマーシャリングを使用できます。次のシナリオを考えてみましょう: 動的キーを使用して JSON オブジェクトから設定する必要があるマップ フィールドを持つ構造体。
問題例
提供されたコードは試行を示しています。 JSON 応答をスライス構造体のマップを含む構造体にアンマーシャリングします (Pair map[string][]Candles)。ただし、アンマーシャリング後もマップは空のままです。
解決策: より単純な構造を選択する
簡単な解決策は、マップを削除し、構造体を変更して、 JSON 構造:
1 2 3 4 | <code class = "go" >type OHLC_RESS struct {
Pair []Candles `json: "XXBTZUSD" `
Last int64 `json: "last" `
}</code>
|
ログイン後にコピー
JSON.Unmarshaler を使用したカスタム アンマーシャリング
または、マップベースの構造を保持するには、json.Unmarshaler インターフェイスのカスタム実装が必要です。 。このアプローチにより、アンマーシャリング プロセスを完全に制御できます。
実装の詳細:
- JSON オブジェクトのキーをデコードされていない JSON 値にデコードします。
- 「最後の」要素を識別し、存在する場合は、それを Last フィールドにデコードします。
- ペア マップを宣言し、JSON オブジェクト内の残りの要素を反復処理して、マップにデコードします。
コード スニペット:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <code class = "go" >func (r *OHLC_RESS) UnmarshalJSON(d []byte) error {
var obj map[string]json.RawMessage
if err := json.Unmarshal(d, &obj); err != nil {
return err
}
if last, ok := obj[ "last" ]; ok {
if err := json.Unmarshal(last, &r.Last); err != nil {
return err
}
delete (obj, "last" )
}
r.Pair = make(map[string][]Candles, len(obj))
for key, val := range obj {
cc := []Candles{}
if err := json.Unmarshal(val, &cc); err != nil {
return err
}
r.Pair[key] = cc
}
return nil
}</code>
|
ログイン後にコピー
以上がGoでスライスのマップを持つ構造体をスライスのマップにアンマーシャリングする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。