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

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

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

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 構造:

1

2

3

4

<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 オブジェクト内の残りの要素を反復処理して、マップにデコードします。

コード スニペット:

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 {

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

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