首页 >后端开发 >Golang >如何在 Go 中将带有切片映射的结构体解组为切片映射?

如何在 Go 中将带有切片映射的结构体解组为切片映射?

Barbara Streisand
Barbara Streisand原创
2024-10-28 04:58:301098浏览

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 结构:

<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. 声明 Pair 映射并迭代 JSON 对象中的剩余元素,将它们解码到映射中。

代码片段:

<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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn