英文:
Go Yaml parse when file starts with -
问题
我正在尝试使用"gopkg.in/yaml.v3"包将一个yaml文件解析为go语言。我还没有解决的问题是解析以"-"开头的文件。例如:
---
- type: people
info:
- { name: John, last: Doe }
...
所以当我尝试解析这个文件时:
package main
import (
"fmt"
"io/ioutil"
"log"
"gopkg.in/yaml.v3"
)
type YamlFile struct {
Type string `yaml:"type"`
}
func main() {
d := YamlFile{}
src, err := ioutil.ReadFile("test1.yaml")
if err != nil {
log.Println(err)
}
err = yaml.Unmarshal(src, &d)
if err != nil {
log.Printf("error: %v", err)
}
fmt.Println(d)
}
输出:error: yaml: unmarshal errors: line 2: cannot unmarshal !!seq into main.YamlFile
当文件中的"-"被移除时,上述代码可以正常工作:
---
type: people
info:
- { name: John, last: Doe }
...
然而,我无法重新格式化文件,所以我需要知道在尝试保留"-"的情况下我做错了什么。感谢任何指导。
英文:
I am trying to parse a yaml file into go using the "gopkg.in/yaml.v3" package.
The problem I haven't been able to solve is parsing a file starting with a -. For example:
---
- type: people
info:
- { name: John, last: Doe }
...
So when I try to parse this
package main
import (
"fmt"
"io/ioutil"
"log"
"gopkg.in/yaml.v3"
)
type YamlFile struct {
type string `yaml:"type"`
}
func main() {
d := YamlFile{}
src, err := ioutil.ReadFile("test1.yaml")
if err != nil {
log.Println(err)
}
err = yaml.Unmarshal(src, &d)
if err != nil {
log.Printf("error: %v", err)
}
fmt.Println(d)
}
output: error: yaml: unmarshal errors:
line 2: cannot unmarshal !!seq into main.YamlFile
The above code works when the - is removed from the file
---
type: people
info:
- { name: John, last: Doe }
...
However I cannot reformat the file so I need to know what I am doing wrong trying to parse with the - in place. Thanks for any pointers in the right direction.
答案1
得分: 2
-
表示这是一个列表/数组。因此,在Go中,你必须将其解组为切片或数组。
将 d := YamlFile{}
改为 d := []YamlFile{}
,你就不会再收到那个错误了。
但请注意,你使用的结构体始终会得到一个空结果,因为它没有导出的字段。
可以尝试使用以下代码:
type YamlFile struct {
Type string `yaml:"type"`
}
英文:
The -
indicates that it's a list/array. Therefore you must unmarshal into a slice or array in Go.
Change d := YamlFile{}
to d := []YamlFile{}
, and you will no longer get that error.
But also note that you'll always get an empty result with the struct you've defined, because it has no exported fields.
Try instead:
type YamlFile struct {
Type string `yaml:"type"`
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论