ホームページ >バックエンド開発 >Golang >JSON オブジェクトをスライスのマップを使用して構造体にアンマーシャリングする方法

JSON オブジェクトをスライスのマップを使用して構造体にアンマーシャリングする方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-31 16:39:29992ブラウズ

How to Unmarshal a JSON Object into a Struct with a Map of Slices?

構造体のスライスのマップへのカスタム アンマーシャリング

問題

JSON をスライスのマップを含む構造体にデコードするには、カスタム アンマーシャリングが必要です。デフォルトの動作を使用すると、マップは空のままになります。

解決策

カスタム アンマーシャラーの使用:

  1. の json.Unmarshaler インターフェイスを実装します。ターゲット構造体。
  2. UnmarshalJSON メソッド内:

    • JSON オブジェクトのキーと値を未加工のデコードされていない JSON としてアンマーシャルします。
    • 生の JSON 値から Last フィールドを抽出します (存在する場合)。
    • 生の値をスライスのマップに変換し、Pair フィールドに割り当てます。

代替解決策 (マップを使用しない):

JSON 構造が固定されている場合は、マップを使用せずにターゲット構造体を調整して JSON レイアウトに一致させることができます。

例:

カスタム UnmarshalJSON メソッドを使用したカスタム アンマーシャリング コード:

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

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

    // Decode and assign Pair field
    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>

構造体を調整することによる代替ソリューション:

<code class="go">type OHLC_RESS struct {
    Pair []Candles `json:"XXBTZUSD"`
    Last int64     `json:"last"`
}</code>

以上がJSON オブジェクトをスライスのマップを使用して構造体にアンマーシャリングする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。