如何将动态Viper或JSON密钥解组为go中的struct字段的一部分

时间:2018-06-07 20:41:32

标签: go viper-go

我找到了编组&当JSON不在"期望"时,GOLANG的unMarshaling非常混乱。格式。例如,在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"`
}

如何进行unMarshalling JSON,更具体地说是viper配置(使用viper.Get(" things")获取Things数组:

t:= Things{
   Name: "123abc",
   Key1: "anything",
   Key2: "more",
}

我特别不确定如何将密钥作为结构字段

1 个答案:

答案 0 :(得分:1)

使用地图作为动态键:

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
}

Playground Example

如果名称必须是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
}

Playground example