在 GOLANG 上解析 YAML 文件时出错,方括号列表前有破折号



在GOLANG中使用gopkg.in/YAML解析YAML文件时。如果YAML文件在括号前有一个破折号,则不读取它。

我有一个语法类似于下面的YAML文件:

servers:
- server_name: ratamahatta
server_groups:
- [r1, r2, r3]
- server_name: kaiowas
server_groups:
- [c1, c2]

如果我在GO中使用以下结构体:

package main
import (
"fmt"
"io/ioutil"
"gopkg.in/yaml.v3"
)
type S struct {
Servers []struct {
ServerName string   `yaml:"server_name"`
ServerGroups []string `yaml:"server_groups"`
} `yaml:"servers"`
}
func main() {
file, err := ioutil.ReadFile("example2.yaml")
if err != nil {
panic(err)
}
var s S
err = yaml.Unmarshal(file, &s)
if err != nil {
panic(err)
}

fmt.Printf("Value: %#vn", s.Servers[0].ServerGroups[0])
}

我:

line 5: cannot unmarshal !!seq into string
line 9: cannot unmarshal !!seq into string

但是,如果我去掉"-"括号前:

servers:
- server_name: ratamahatta
server_groups:
[r1, r2, r3]
- server_name: kaiowas
server_groups:
[c1, c2]

那么它工作得很好。

如果我改变这个:

ServerGroups []string `yaml:"server_groups"`

ServerGroups struct {} `yaml:"server_groups"` 

得到

cannot unmarshal !!seq into struct {}

所以基本上我不知道如何在这种情况下读取YAML序列。

感谢

您正在处理的YAML- [r1, r2, r3]是序列的序列,这意味着可能有额外的条目,例如

- server_name: ratamahatta
server_groups:
- [r1, r2, r3]
- [r4, r5, r6]    

所以要解析这个,你需要一个额外的维度,即[][]string。工作示例如下(playground):

const testYaml = `servers:
- server_name: ratamahatta
server_groups:
- [r1, r2, r3]
- [r4, r5, r6]
- server_name: kaiowas
server_groups:
- [c1, c2]
`
type S struct {
Servers []struct {
ServerName   string     `yaml:"server_name"`
ServerGroups [][]string `yaml:"server_groups"`
} `yaml:"servers"`
}
func main() {
var s S
if err := yaml.Unmarshal([]byte(testYaml), &s); err != nil {
panic(err)
}
fmt.Printf("Value: %#vn", s.Servers[0].ServerGroups[0]) // []string{"r1", "r2", "r3"}
fmt.Printf("Value: %#vn", s.Servers[0].ServerGroups[1]) // []string{"r4", "r5", "r6"}
fmt.Printf("Value: %#vn", s.Servers[1].ServerGroups[0]) // []string{"c1", "c2"}
}

最新更新