Как мне демаршировать ключи Dynamic Viper или JSON как часть структурного поля в go - PullRequest
0 голосов
/ 07 июня 2018

Я нахожу маршалинг и анмаршалинг в 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 Ответ

0 голосов
/ 07 июня 2018

Используйте карту для динамических клавиш:

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
}

Пример игровой площадки

Если имя должнобыть членом структуры, затем написать цикл, чтобы добавить его после демаршала:

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
}

Пример игровой площадки

...