首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将动态Viper或JSON键解组为go中struct字段的一部分

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

Stack Overflow用户
提问于 2018-06-08 04:41:32
回答 1查看 1.6K关注 0票数 1

当unMarshaling不是“所需的”格式时,我发现GOLANG中的marshaling & JSON非常令人困惑。例如,在JSON配置文件中(我正在尝试将其与Viper一起使用),我有一个配置文件,如下所示:

代码语言:javascript
复制
{
  "things" :{
    "123abc" :{
      "key1": "anything",
      "key2" : "more"
    },
    "456xyz" :{
      "key1": "anything2",
      "key2" : "more2"
    },
    "blah" :{
      "key1": "anything3",
      "key2" : "more3"
    }
  }
}

其中"things“可以是n层以下的另一个对象中的对象,我有一个结构:

代码语言:javascript
复制
type Thing struct {
  Name string  `?????`
  Key1 string  `json:"key2"`
  Key2 string  `json:"key2"`
}

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

代码语言:javascript
复制
t:= Things{
   Name: "123abc",
   Key1: "anything",
   Key2: "more",
}

我特别不确定如何将键作为struct字段获取

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-08 04:47:22

对动态关键点使用贴图:

代码语言:javascript
复制
type X struct {
    Things map[string]Thing
}

type Thing struct {
    Key1 string
    Key2 string
}

像这样解组:

代码语言:javascript
复制
var x X
if err := json.Unmarshal(data, &x); err != nil {
    // handle error
}

Playground Example

如果名称必须是结构的成员,那么在解组之后编写一个循环来添加它:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50749869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档