从yaml文件中删除属性

时间:2018-02-11 15:34:46

标签: go struct type-conversion

我需要读取yaml文件并更改一些属性值并将其写回FS。

文件内容是这样的

ID: mytest
mod:
- name: user
  type: dev
  parameters:
    size: 256M
  build:
    builder: mybuild


type OBJ struct {
    Id            string      `yaml:"ID"`
    Mod           []*Mod   `yaml:"mod,omitempty"`
}


type Mod struct {
    Name       string
    Type       string
    Parameters       Parameters `yaml:"parameters,omitempty"`
    Build            Parameters `yaml:"build,omitempty"`

}

我需要从输出中省略type属性

ID: mytest
mod:
- name: user
  parameters:
    size: 256M
  build:
    builder: mybuild

问题在于,我可以阅读它,我可以更改属性值但不能删除密钥(type

我使用的代码

yamlFile, err := ioutil.ReadFile("test.yaml")

//Here I parse the file to the model I’ve which is working fine
err := yaml.Unmarshal([]byte(yamlFile), &obj)
if err != nil {
    log.Printf("Yaml file is not valid, Error: " + err.Error())
    os.Exit(-1)
}

现在我能够循环使用像

这样的属性
obj := models.OBJ{}


for i, element := range obj.Mod {

//Here I was able to change property data

mta.Mod[i].Name = "test123"

但不确定在回写FS时如何省略type的整个属性。

我使用这个操作系统: https://github.com/go-yaml/yaml/tree/v2

2 个答案:

答案 0 :(得分:2)

你只需要添加:

type Mod struct {
    Name       string     `yaml:"name"`
    Type       string     `yaml:"type,omitempty"` // note the omitempty
    Parameters Parameters `yaml:"parameters,omitempty"`
    Build      Parameters `yaml:"build,omitempty"`
}

现在如果你这样做(如果你愿意,可以在内部循环):

obj.Mod[0].Type = "" // set to nil value of string
byt, _ := yaml.Marshal(obj)

并将byt写入文件,该类型将被删除。

要点是具有omitempty标记的任何结构字段,当使用yaml.Marshal进行编组时,如果字段为空,则忽略(删除)字段/ strong>(又名nil}。

official documentation中的更多信息。

答案 1 :(得分:1)

如果您想从整个YAML中省略type,则可以将数据编组为type不存在的对象

type OBJ struct {
    Id  string `yaml:"ID"`
    Mod []*Mod `yaml:"mod,omitempty"`
}

type Mod struct {
    Name        string
    //Type      string `yaml:"type"`
    Parameters  Parameters `yaml:"parameters,omitempty"`
    Build       Parameters `yaml:"build,omitempty"`
}
如果您将数据编组到此对象中,

type将被删除。

另一种解决方案,如果您不想使用多个对象。

在“类型”中使用omitempty。因此,当Type的值为""时,它将被忽略

type Mod struct {
    Name       string
    Type       string `yaml:"type,omitempty"`
    Parameters  Parameters `yaml:"parameters,omitempty"`
    Build       Parameters `yaml:"build,omitempty"`
}

并且这样做

for i, _ := range obj.Mod {
    obj.Mod[i].Type = ""
}