将YAML解组为未知结构

时间:2017-01-21 02:16:20

标签: go yaml

很抱歉这个令人困惑的标题,我在写这个问题时遇到了麻烦。所以假设我有一个像这样的YAML配置文件

animals:
  -
    type: whale
    options:
      color: blue
      name: Mr. Whale
    features:
       -
         type: musician
         options:
           instruments:
             - Guitar
             - Violin

非常人为的例子,但它与我真正合作的东西直接相似。

所以现在我有一些结构来编组这个配置到

type Config struct {
  AnimalConfigs []*AnimalConfig `yaml:"animals"`
}

type AnimalConfig struct{
  Type string
  Options map[string]string // ????
  Features []*FeatureConfig
}

type FeatureConfig struct{
  Type string
  Options ????
}

所以这里的问题是动物类型(鲸鱼等)和特征(音乐家等等)不是提前确定的,它们可以作为单独的模块添加,并且每个都可以有它们的自己的配置。所以说有人正在使用这个库,并希望添加自己的动物。我不知道这只动物是什么,它的选择是什么,以及它的功能是什么。我也不知道该功能的结构。我所知道的是它将具有type属性和options属性。我希望开发人员能够添加自定义动物和功能,我的库可以执行YourAnimal.Create(yourConfig)之类的操作。

我正在使用go-yaml库。正如你在AnimalConfig结构中看到的那样,我最初的想法是让optionsfeatures只是map[string]string,然后让自定义模块将该字符串解组为它们自己的结构,但是例如,使用musician功能不会起作用,因为instruments是一个列表,而不是一个字符串。谢谢!

2 个答案:

答案 0 :(得分:0)

我认为,通常来说,您不知道将要生成的结构时,您要问的是如何解组YAML,是吗?如果是这样,我所做的就是使用ghodss/yaml将YAML转换为JSON,然后使用标准的encoding/json进行解组。这样可以使您struct拥有YAML文档中的所有内容,但是您必须通过它来“类型切换”,而且键名当然可能不被称为prioir。

下面是一个示例:https://play.golang.org/p/8mcuot-lw0y

答案 1 :(得分:-1)

您可以使用map[string]interface{}类型的配置,让开发人员使用您的库解码interface{}到所需的结构中。
示例:https://play.golang.org/p/RVqKP09KR8