我正在使用github.com/goccy/go-yaml通过PATH读取YAML值
示例yaml文件
tree:
branch:
slices:
slice1:
- w: 1
- w: 2
h: 3
slice2:
- w: 11
h: 22
字符串
我使用下面的代码来解封它使用YAML路径
主程序包
import (
"fmt"
"log"
"strings"
"github.com/goccy/go-yaml"
)
type slice struct {
W int
H int
}
type sliceObject struct {
Slices []slice
}
func main() {
yml := `
tree:
branch:
slices:
slice1:
- w: 1
- w: 2
h: 3
slice2:
- w: 11
h: 22
`
pathStr := "$.tree.branch.slices"
path, err := yaml.PathString(pathStr)
if err != nil {
log.Panicf("failed to construct YAML path %s", err)
}
var sl map[string]sliceObject
if err := path.Read(strings.NewReader(yml), &sl); err != nil {
log.Panicf("failed to read value for path %s error %+v", pathStr, err)
}
fmt.Printf("object: %+v", sl)
}
型
上面的代码失败,出现以下错误
- failed to get map node:
github.com/goccy/go-yaml.(*Decoder).keyToNodeMap
/Users/.../go/pkg/mod/github.com/goccy/[email protected]/decode.go:977
- [2:9] sequence was used where mapping is expected:
github.com/goccy/go-yaml.errUnexpectedNodeType
/Users/.../go/pkg/mod/github.com/goccy/[email protected]/decode.go:542
型
但如果我将var sl map[string]sliceObject
更改为var sl map[string][]slice
,
我真的不想在YAML中添加另一个级别。
2条答案
按热度按时间9vw9lbht1#
由于您定义的
sliceObject
包含Slices
属性,因此需要在声明sliceObject
的slice1
和slice2
示例后添加一个名为slices
的额外级别:字符串
输出量:
型
但是,由于您不想添加另一个层,您可以简单地将
sliceObject
定义为slice
类型的切片(个人不推荐,因为它可能会引起混淆,它应该可以工作:型
输出量:
型
顺便说一句,将
var sl map[string]sliceObject
更改为var sl map[string][]slice
之所以有效,是因为您基本上告诉解析器寻找将slice1
和slice2
转换为[]slice
而不是Slices
的方法(同样,因为您缺少slices
键)--基本上与将sliceObject
重新定义为[]slice
相同,如上面的第二个代码示例所示soat7uwm2#
实际上你并不需要将
sliceObject
定义为一个结构体。相反,你可以修改如下来使它工作:字符串