ホームページ > バックエンド開発 > Golang > Goでスライスのマップを持つ構造体をスライスのマップにアンマーシャリングする方法は?

Goでスライスのマップを持つ構造体をスライスのマップにアンマーシャリングする方法は?

Barbara Streisand
リリース: 2024-10-28 04:58:30
オリジナル
1085 人が閲覧しました

How to Unmarshal a Struct with a Map of Slices into a Map of Slices in Go?

構造体をスライスのマップにアンマーシャリングする

Go では、デフォルトのアンマーシャリング動作が十分でない場合にカスタム アンマーシャリングを使用できます。次のシナリオを考えてみましょう: 動的キーを使用して JSON オブジェクトから設定する必要があるマップ フィールドを持つ構造体。

問題例

提供されたコードは試行を示しています。 JSON 応答をスライス構造体のマップを含む構造体にアンマーシャリングします (Pair map[string][]Candles)。ただし、アンマーシャリング後もマップは空のままです。

解決策: より単純な構造を選択する

簡単な解決策は、マップを削除し、構造体を変更して、 JSON 構造:

<code class="go">type OHLC_RESS struct {
    Pair []Candles `json:"XXBTZUSD"`
    Last int64     `json:"last"`
}</code>
ログイン後にコピー

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

または、マップベースの構造を保持するには、json.Unmarshaler インターフェイスのカスタム実装が必要です。 。このアプローチにより、アンマーシャリング プロセスを完全に制御できます。

実装の詳細:

  1. JSON オブジェクトのキーをデコードされていない JSON 値にデコードします。
  2. 「最後の」要素を識別し、存在する場合は、それを Last フィールドにデコードします。
  3. ペア マップを宣言し、JSON オブジェクト内の残りの要素を反復処理して、マップにデコードします。

コード スニペット:

<code class="go">func (r *OHLC_RESS) UnmarshalJSON(d []byte) error {
    // Decode keys only.
    var obj map[string]json.RawMessage
    if err := json.Unmarshal(d, &obj); err != nil {
        return err
    }

    // Decode "last" element.
    if last, ok := obj["last"]; ok {
        if err := json.Unmarshal(last, &r.Last); err != nil {
            return err
        }
        delete(obj, "last")
    }

    // Decode remaining elements into Pair map.
    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 サイトの他の関連記事を参照してください。

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