首页 >后端开发 >Golang >当 JSON 键与结构体字段名称不匹配时,如何将结构体自定义解组到 Go 中的切片映射中?

当 JSON 键与结构体字段名称不匹配时,如何将结构体自定义解组到 Go 中的切片映射中?

Patricia Arquette
Patricia Arquette原创
2024-10-26 14:00:04819浏览

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