我正在尝试解码 YAML 条目,这些条目可以是字符串或键列表:值字符串(根据 Go 的映射)。我无法弄清楚如何悲伤地完成这项工作。我知道我可以编写自己的解码器,但这似乎只适用于结构。
我有第一部分工作:
package main
import (
"log"
"gopkg.in/yaml.v2"
)
type Data struct {
Entry []Entry `yaml:"entries"`
}
type Entry map[string]string
var dat string = `
entries:
- keya1: val1
keya2: val2
- keyb1: val1
keyb2: val2
- val3`
func main() {
out := Data{}
if err := yaml.Unmarshal([]byte(dat), &out); err != nil {
log.Fatal(err)
}
log.Printf("%+v", out)
}
但显然 - val3
条目现在会导致错误。我怎样才能让它识别列表和单个字符串条目?
谢谢
最佳答案
这只是优秀的@Benjamin Kadish answer above 的后续,但这里有一个更完整的版本,它使用 yaml.v3,这使得它更加明显。请注意,解码项的类型是 map[string]interface{}
而不是 yaml v3 中的 map[interface{}]interface{}
。
package main
import (
"gopkg.in/yaml.v3"
"log"
)
type Data struct {
Entry []Entry `yaml:"entries"`
}
type Entry interface {}
var dat string = `
entries:
- keya1: val1
keya2: val2
- keyb1: val1
keyb2: val2
- val3`
func main() {
out := Data{}
if err := yaml.Unmarshal([]byte(dat), &out); err != nil {
log.Fatal(err)
}
for _, entry := range out.Entry {
switch i := entry.(type) {
case string:
log.Printf("i is a string: %+v\n", i)
case map[string]interface{}:
log.Printf("i is a map.")
for k,v := range i {
log.Printf("%s=%v\n",k,v)
}
default:
log.Printf("Type i=%s", i)
}
}
}
关于go - 将 GO YAML 解码为 Map 或 String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48569309/