【问题标题】:Golang yaml unmarshal structureGolang yaml 解组结构
【发布时间】:2021-03-24 17:34:18
【问题描述】:

我需要一些帮助来处理 golang 中的配置文件。
我为隐私重命名了每个字段和值(只是说)
我有这个 yaml 配置文件:

Label1:
  field1: value1
  field2: value2
  field3: value3
  field4: value4
Label2:
  field1: value1
  field2: value2
  field3: value3
  field4: value4
Label3:
  field1: value1
  field2: value2
  field3: value3
  field4: value4

我正在使用https://github.com/kylelemons/go-gypsy/tree/master/yaml 将此 yaml 文件手动解码为以下结构(手动遍历节点列表)。我无法控制该文件上有多少“标签”项,因此我需要一种通用的解析方式(并且使用上述库是通用的)

type Obj struct {
    Field1 string `yaml:"field1"`
    Field2 string `yaml:"field2"`
    Field3 string `yaml:"field3"`
    Field4 bool   `yaml:"field4"`
}

type ObjConfig struct {
    Objs map[string]Obj
}

我还有其他几个配置文件,要简单得多,我可以使用以下注释对其进行解码:

type conf1 struct {
    Field1 int    `yaml:"field1"`
    Field2 string `yaml:"field2"`
}

我正在为这些使用自动 yaml Unmarshal(通过 Viper 框架),它工作正常。

到目前为止,混合这两种处理配置文件的方式并不是什么大问题。但是现在我需要从我设置的 spring 配置服务器中检索文件,而不是在本地保存文件。我正在使用这个库来这样做: https://github.com/Piszmog/cloudconfigclient

它适用于带有yaml:"fieldX" 注释的结构,我可以直接反序列化它。 但是对于第一个结构当然它不起作用,我需要一个解决方法。该库 (cloudconfigclient) 使用的是经典的 yaml 解码器,因此我无法编写自己的自定义解码器。查看它使用此代码反序列化配置文件的库代码(resp.Body 是 yaml 配置文件内容):

var dest interface{}
yaml.NewDecoder(resp.Body).Decode(dest)

我可以更改配置文件结构,只要我能在其中获得相同的数据。也许我可以使用类似的东西

Labels:
  - Label1:
     field1: value1
     field2:value2
....
  - Label2:
     field1:value1
....

并使用 unmarshal 的 yaml 映射处理?

我显然没有使用 golang 的经验,我很想在这里得到一些帮助。

总而言之,问题是如何使用 yaml.Unmarshal 和经典解码器解码第一个 yaml 文件(通过我不知道的特定注释,或更改 yaml 结构本身)。

【问题讨论】:

  • 问题到底是什么?
  • 对不起,很多上下文,但问题不是很清楚,我已经编辑它并试图在最后总结问题。
  • 你试过了吗yaml.to-go.online
  • 我刚刚尝试过,但它不起作用,因为我需要一种通用的解析方式(我无法控制配置文件中有多少标签项)。
  • 您可以使用 Viper 包来处理几乎任何类型的配置文件。这就是我用于我的项目的东西github.com/spf13/viper

标签: go yaml


【解决方案1】:

我通过将它映射到一个通用的 map[string]interface{} 类型来让它工作

var configResponse map[string]interface{}
    err = configClient.GetFileFromBranch(BRANCH, CONF_DIR, CONF_FILE, &configResponse )

然后自己处理模型进入结构

type ObjConfig struct {
    Objs map[string]Obj
}

不是最容易阅读也不是对错误解决方案有弹性,但它正在工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多