首页  >  文章  >  后端开发  >  如何使用切片映射将 JSON 对象解组为结构?

如何使用切片映射将 JSON 对象解组为结构?

Patricia Arquette
Patricia Arquette原创
2024-10-31 16:39:29895浏览

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

将结构自定义解组为切片映射

问题

需要自定义解组才能将 JSON 解码为具有切片映射的结构。使用默认行为,映射保持为空。

解决方案

使用自定义 Unmarshaler:

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

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