【问题标题】:Go Yaml parse when file starts with -文件以 - 开头时进行 Yaml 解析
【发布时间】:2021-12-31 16:00:33
【问题描述】:

我正在尝试使用“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 }
...

但是我无法重新格式化文件,所以我需要知道我在尝试使用 - 进行解析时做错了什么。感谢您提供正确方向的任何指示。

【问题讨论】:

    标签: go yaml


    【解决方案1】:

    - 表示它是一个列表/数组。因此,您必须在 Go 中解组为切片或数组。

    d := YamlFile{} 更改为d := []YamlFile{},您将不再收到该错误。

    但还要注意,您定义的结构总是会得到一个空结果,因为它没有导出字段。

    试试吧:

    type YamlFile struct {
      Type string `yaml:"type"`
    }
    

    See it on the playground.

    【讨论】:

    • 谢谢。出于某种原因,因为它位于文件的开头,所以我没有想到这是一个数组!。至于导出的东西,是的,那只是伪代码中的一个错误。
    猜你喜欢
    • 2018-01-07
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2015-04-25
    相关资源
    最近更新 更多