如何解组 Dynamic Viper 或 JSON 键作为 go 中结构字段的一部分
How Do I Unmarshal Dynamic Viper or JSON keys as part of struct field in go
当 JSON 不是 "desired" 格式时,我发现 GOLANG 中的封送处理和解封处理非常混乱。例如,在 JSON 配置文件中(我试图将其与 Viper 一起使用)我有一个看起来像这样的配置文件:
{
"things" :{
"123abc" :{
"key1": "anything",
"key2" : "more"
},
"456xyz" :{
"key1": "anything2",
"key2" : "more2"
},
"blah" :{
"key1": "anything3",
"key2" : "more3"
}
}
}
其中 "things" 可能是 n 层下另一个对象中的对象
我有一个结构:
type Thing struct {
Name string `?????`
Key1 string `json:"key2"`
Key2 string `json:"key2"`
}
如何解组 JSON 更具体地说是 viper 配置(使用 viper.Get("things") 获取 Things
的数组,例如:
t:= Things{
Name: "123abc",
Key1: "anything",
Key2: "more",
}
我特别不确定如何将密钥作为结构字段获取
为动态键使用映射:
type X struct {
Things map[string]Thing
}
type Thing struct {
Key1 string
Key2 string
}
像这样解组:
var x X
if err := json.Unmarshal(data, &x); err != nil {
// handle error
}
如果名字必须是struct的成员,那么写一个循环在unmarshal之后添加:
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 不是 "desired" 格式时,我发现 GOLANG 中的封送处理和解封处理非常混乱。例如,在 JSON 配置文件中(我试图将其与 Viper 一起使用)我有一个看起来像这样的配置文件:
{
"things" :{
"123abc" :{
"key1": "anything",
"key2" : "more"
},
"456xyz" :{
"key1": "anything2",
"key2" : "more2"
},
"blah" :{
"key1": "anything3",
"key2" : "more3"
}
}
}
其中 "things" 可能是 n 层下另一个对象中的对象 我有一个结构:
type Thing struct {
Name string `?????`
Key1 string `json:"key2"`
Key2 string `json:"key2"`
}
如何解组 JSON 更具体地说是 viper 配置(使用 viper.Get("things") 获取 Things
的数组,例如:
t:= Things{
Name: "123abc",
Key1: "anything",
Key2: "more",
}
我特别不确定如何将密钥作为结构字段获取
为动态键使用映射:
type X struct {
Things map[string]Thing
}
type Thing struct {
Key1 string
Key2 string
}
像这样解组:
var x X
if err := json.Unmarshal(data, &x); err != nil {
// handle error
}
如果名字必须是struct的成员,那么写一个循环在unmarshal之后添加:
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
}