我正在用goyaml lib阅读一个YAML文件.我打算修改它的一些条目,如果要添加的密钥还不存在,则添加一个条目.
例如:
原创YAML
root:
entry1: val1
1个模块和1个添加目标YAML
root:
entry1: valUpdated
entry2: newkey added
我找不到任何允许我向YAML添加 node 的YAML库.
谢谢你的帮忙
我正在用goyaml lib阅读一个YAML文件.我打算修改它的一些条目,如果要添加的密钥还不存在,则添加一个条目.
例如:
原创YAML
root:
entry1: val1
1个模块和1个添加目标YAML
root:
entry1: valUpdated
entry2: newkey added
我找不到任何允许我向YAML添加 node 的YAML库.
谢谢你的帮忙
如果解组为yaml.Node
,则可以使用go-yaml执行此操作:
package main
import (
"os"
"gopkg.in/yaml.v3"
)
var input = []byte(`root:
entry1: val1`)
func main() {
var document yaml.Node
if err := yaml.Unmarshal(input, &document); err != nil {
panic(err)
}
data := document.Content[0]
var rootVal *yaml.Node
for i := 0; i < len(data.Content); i += 2 {
node := data.Content[i]
if node.Kind == yaml.ScalarNode && node.Value == "root" {
rootVal = data.Content[i+1]
break
}
}
if rootVal == nil {
panic("root key missing")
}
found := false
for i := 0; i < len(rootVal.Content); i += 2 {
node := rootVal.Content[i]
if node.Kind != yaml.ScalarNode {
continue
}
switch node.Value {
case "entry1":
rootVal.Content[i+1].SetString("valUpdated")
case "entry2":
found = true
}
}
if !found {
var key, value yaml.Node
key.SetString("entry2")
value.SetString("newkey added")
rootVal.Content = append(rootVal.Content, &key, &value)
}
out, err := yaml.Marshal(data)
if err != nil {
panic(err)
}
os.Stdout.Write(out)
}
输出:
root:
entry1: valUpdated
entry2: newkey added
Unmarshal
将获得一个文档 node ,其中根 node 是唯一的内容 node .Marshal
期望根 node 作为数据,因此您需要向其提供data
而不是document
.我真的不知道为什么API会是这样的.