JSON キーが構造体のフィールド名と一致しない場合、Go で構造体をスライスのマップにカスタム アンマーシャリングするにはどうすればよいですか?

Patricia Arquette
リリース: 2024-10-26 14:00:04
オリジナル
751 人が閲覧しました

How can I custom unmarshal a struct into a map of slices in Go when the JSON keys don't match the struct field names?

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

JSON データを扱うとき、JSON オブジェクト内の特定の要素をデータ構造に合わせたフィールド。ただし、デフォルトの JSON アンマーシャリング メカニズムが常にこれらの要件を満たしているとは限りません。ここでカスタム アンマーシャリングが登場します。

この例では、Candle のスライスを値として期待するマップ フィールド ペアを持つ構造体 OHLC_RESS があります。ただし、最初のコードはペア マップの設定に失敗します。

問題の理解

アンマーシャリング動作はいくつかの要因に起因します。

  1. JSON オブジェクト キーが対応していません。
  2. フィールド名ペアは、アンマーシャラーに特別な意味を与えません。
  3. Last フィールドは、その JSON キー (最後) がフィールド名と一致するため、アンマーシャリングされます。

カスタマイズされたアンマーシャリング ソリューション

これらの問題に対処するには、構造体内に関連するメソッドを実装することで json.Unmarshaler インターフェイスを活用できます。

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

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

    // Unmarshal the remaining elements into the 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>
ログイン後にコピー

この解決策:

  1. 残りのオブジェクトの値から Last フィールドのデコードを分離します。
  2. 文字列キーと []Candles 値を使用してマップを作成し、ペアを保存します。
  3. 残りの JSON キーと値を反復処理し、それぞれを Candle のスライスにアンマーシャリングして、ペア マップに保存します。

このカスタム アンマーシャリングを実装することで、特定の JSON 要素がどのように配置されるかを制御する柔軟性が得られます。 JSON オブジェクトの構造が直接一致しない場合でも、目的のデータ構造にマッピングされます。

以上がJSON キーが構造体のフィールド名と一致しない場合、Go で構造体をスライスのマップにカスタム アンマーシャリングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!