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