首页 >后端开发 >Golang >如何在 Go 中使用动态键解组 JSON?

如何在 Go 中使用动态键解组 JSON?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-01 19:25:20310浏览

How to Unmarshal JSON with Dynamic Keys in Go?

Viper/JSON 解组中的动态密钥处理

处理偏离预定格式的 JSON 数据时,Go 中的解组可能具有挑战性。考虑一个带有动态键的 JSON 配置文件,如下所示:

{
  "things" :{
    "123abc" :{
      "key1": "anything",
      "key2" : "more"
    },
    "456xyz" :{
      "key1": "anything2",
      "key2" : "more2"
    },
    "blah" :{
      "key1": "anything3",
      "key2" : "more3"
    }
  }
}

要将这些数据解组到带有动态键的 Go 结构体中,一种方法是使用映射:

type X struct {
    Things map[string]Thing
}

type Thing struct {
    Key1 string
    Key2 string
}

通过使用map[string]Thing,生成的结构可以处理任意数量的动态键。使用以下方式解组数据:

var x X
if err := json.Unmarshal(data, &x); err != nil {
    // handle error
}

此方法允许直接解组 JSON 和 Viper 中的动态键(使用 viper.Get("things") 获取 Thing 值数组)。

但是,如果密钥本身必须是结构体的成员,则可以使用解组后循环来更新fields:

type Thing struct {
    Name string `json:"-"` // add the field
    Key1 string
    Key2 string
}

// Fix the name field after unmarshal
for k, t := range x.Things {
    t.Name = k
    x.Things[k] = t
}

这允许将键合并到结构中,同时保留 JSON 数据的原始动态性质。

以上是如何在 Go 中使用动态键解组 JSON?的详细内容。更多信息请关注PHP中文网其他相关文章!

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