首頁  >  文章  >  後端開發  >  當 JSON 鍵與結構體欄位名稱不符時,如何將結構體自訂解組到 Go 中的切片映射中?

當 JSON 鍵與結構體欄位名稱不符時,如何將結構體自訂解組到 Go 中的切片映射中?

Patricia Arquette
Patricia Arquette原創
2024-10-26 14:00:04742瀏覽

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 解組機制可能不會總是滿足這些要求。這就是自訂解組發揮作用的地方。

在提供的範例中,您有一個 OHLC_RESS 結構體,其映射欄位 Pair 期望蠟燭片作為值。但是,初始代碼無法填入 Pair 映射。

理解問題

解組行為源自於多個因素:

  1. JSON 物件鍵不對應建構欄位名稱。
  2. 欄位名稱 Pair 不會為解組器提供任何特殊意義。
  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 鍵和值,將每個鍵和值解組為蠟燭片並將其儲存在 Pair 映射中。

透過實作此自訂解組,您可以靈活地控制特定 JSON 元素的方式對應到您想要的資料結構,即使 JSON 物件的結構不會直接與其對齊。

以上是當 JSON 鍵與結構體欄位名稱不符時,如何將結構體自訂解組到 Go 中的切片映射中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn