ホームページ >バックエンド開発 >Golang >カスタム処理を使用して JSON マップを Go 構造体にアンマーシャリングする方法

カスタム処理を使用して JSON マップを Go 構造体にアンマーシャリングする方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-26 06:21:30220ブラウズ

How to Unmarshal a JSON Map into a Go Struct with Custom Handling?

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

Go では、アンマーシャリングには JSON データを Go データ構造に変換することが含まれます。アンマーシャリングの基本原則は簡単ですが、マップの設定などの特定のシナリオではカスタム処理が必要になる場合があります。

問題: アンマーシャリングでのマップの設定

よくある問題は、 Go 構造体にマップします。次の例を考えてみましょう。

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

// Candles represents individual candlesticks within the map.
type Candles struct {
    // ... Time, Open, High, Low, Close, VWAP, Volume, Count fields omitted
}</code>

上記の構造体を使用して JSON データをアンマーシャリングしようとすると、Last フィールドは正常に設定されますが、ペア マップは空のままです。

解決策: カスタム アンマーシャリングStruct

Go のデフォルトのアンマーシャリング プロセスでは、フィールド名とタグを使用して JSON キーと照合します。ただし、この場合、ペア マップのキー名が事前にわかっていないため、ペア マップのカスタム処理が必要になります。これを実現するには、OHLC_RESS 構造体の json.Unmarshaler インターフェイスを実装します。

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

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

    // Decode 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>

このカスタム アンマーシャリング関数は、デコード プロセスをステップに分割します。まずオブジェクトのキーをデコードし、次に「最後の」要素を個別に処理し、最後に残りの要素をペア マップにデコードします。このアプローチにより、デコード プロセスを制御できるようになり、ペア マップなどの特定のフィールドのカスタム処理が可能になります。

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

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