Как я могу Unmarshal Dynamic Viper или JSON ключи как часть структуры поля в go
Я нахожу маршалинг и демаршалинг в GOLANG очень запутанным, когда JSON находится не в "желаемом" формате. Например, в файле конфигурации JSON (который я пытаюсь использовать с Viper) у меня есть файл конфигурации, который выглядит следующим образом:
{
"things" :{
"123abc" :{
"key1": "anything",
"key2" : "more"
},
"456xyz" :{
"key1": "anything2",
"key2" : "more2"
},
"blah" :{
"key1": "anything3",
"key2" : "more3"
}
}
}
где "вещи" могут быть объектом в другом объекте на n уровней ниже, и у меня есть структура:
type Thing struct {
Name string `?????`
Key1 string `json:"key2"`
Key2 string `json:"key2"`
}
Как мне разобрать JSON и, более конкретно, конфигурацию viper (используя viper.Get("вещи"), чтобы получить массив Things
лайк:
t:= Things{
Name: "123abc",
Key1: "anything",
Key2: "more",
}
Я особенно не уверен, как получить ключ как поле структуры
1 ответ
Решение
Используйте карту для динамических ключей:
type X struct {
Things map[string]Thing
}
type Thing struct {
Key1 string
Key2 string
}
Unmarshal, как это:
var x X
if err := json.Unmarshal(data, &x); err != nil {
// handle error
}
Если имя должно быть членом структуры, напишите цикл, чтобы добавить его после 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
}