首页 > 后端开发 > Golang > 如何使用自定义 UnmarshalJSON 函数展平 Go 中的嵌套 JSON 结构?

如何使用自定义 UnmarshalJSON 函数展平 Go 中的嵌套 JSON 结构?

Susan Sarandon
发布: 2024-10-27 08:04:02
原创
673 人浏览过

How to Flatten Nested JSON Structures in Go Using Custom UnmarshalJSON Functions?

展平嵌套 JSON

在 Go 中导航具有多层嵌套的复杂 JSON 结构可能具有挑战性。当需要将这些嵌套结构扁平化为更简化的格式时,通常需要自定义解决方案。

在所呈现的场景中,任务是扁平化包含嵌套社交类型和进一步嵌套的 JSON 响应。脸书类型。目标是消除中间的 Facebook 类型并将其属性扁平化为 Social 类型。

自定义 UnmarshalJSON 函数

为了实现这一点,我们可以利用 Go 的 UnmarshalJSON 函数的强大功能,它允许您自定义 JSON 如何解码为结构体。以下是如何实现展平嵌套 JSON 的方法:

<code class="go">type Social struct {
    // ... existing properties ...
    FacebookLikes       uint32 `json:"-"`
    FacebookShares      uint32 `json:"-"`
    FacebookComments    uint32 `json:"-"`
    FacebookTotal       uint32 `json:"-"`
}

func (s *Social) UnmarshalJSON(data []byte) error {
    m := make(map[string]interface{})
    if err := json.Unmarshal(data, &m); err != nil {
        return err
    }

    m = Flatten(m)

    // Extract nested Facebook properties
    if fbMap, ok := m["Facebook"].(map[string]interface{}); ok {
        s.FacebookLikes = fbMap["FacebookLikes"].(uint32)
        s.FacebookShares = fbMap["FacebookShares"].(uint32)
        s.FacebookComments = fbMap["FacebookComments"].(uint32)
        s.FacebookTotal = fbMap["FacebookTotal"].(uint32)
    }

    return nil
}</code>
登录后复制

展平辅助函数

展平辅助函数负责删除嵌套映射并将其替换为点分隔键:

<code class="go">func Flatten(m map[string]interface{}) map[string]interface{} {
    o := make(map[string]interface{})
    for k, v := range m {
        switch child := v.(type) {
        case map[string]interface{}:
            nm := Flatten(child)
            for nk, nv := range nm {
                o[k+"."+nk] = nv
            }
        default:
            o[k] = v
        }
    }
    return o
}</code>
登录后复制

使用这种方法,嵌套的 Facebook 类型被删除,其属性被扁平化为 Social 类型,从而产生更简洁且易于管理的数据结构。

以上是如何使用自定义 UnmarshalJSON 函数展平 Go 中的嵌套 JSON 结构?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板