在Golang中解析yaml时出错

时间:2018-08-16 13:36:05

标签: go struct yaml

我有一个类似Yaml的代码,需要使用go进行解析。 当我尝试运行带有解析的代码时,出现错误。 下面是代码:

var runContent= []byte(`

- runners:
   - name: function1
     type: func1
      - command: spawn child process
      - command: build
      - command: gulp

  - name: function1
    type: func2
      - command: run function 1
  - name: function3
    type: func3
      - command: ruby build

  - name: function4
    type: func4
      - command: go build 

`)

这些是类型:

type Runners struct {

    runners string `yaml:"runners"`
        name string `yaml:”name”`
        Type: string  `yaml: ”type”`
        command  [] Command 
}


type Command struct {
    command string `yaml: ”command”`
}



runners := Runners{}
err = yaml.Unmarshal(runContent, &runners)
if err != nil {
    log.Fatalf("Error : %v", err)
}

当我尝试解析它时,出现错误invalid map,这里可能缺少什么?

1 个答案:

答案 0 :(得分:1)

您发布的代码包含多个错误,包括结构字段Type。您代码中提供的yaml无效。将yaml解组为struct时,这会导致err。

在解组Yaml时,要求:

  

解码值的类型应与   各自的值都出来了。如果由于一个或多个值而无法解码   如果类型不匹配,则解码将部分继续,直到   YAML内容,并返回* yaml.TypeError及其详细信息   所有缺失的值。

与此相关:

  

仅在导出结构字段时才对其进行编组(具有   大写的首字母),并且使用字段名称取消编组   小写为默认键。

在定义包含空格的yaml标签时也出错。可以通过字段标签中的“ yaml”名称定义自定义键:第一个逗号之前的内容用作键。

type Runners struct {

    runners string `yaml:"runners"` // fields should be exportable
        name string `yaml:”name”`
        Type: string  `yaml: ”type”` // tags name should not have space in them.
        command  [] Command 
} 

要使结构可导出,请将结构和字段转换为大写的起始字母,并在yaml标记名称中删除空格:

type Runners struct {
    Runners string `yaml:"runners"`
    Name string `yaml:"name"`
    Type string `yaml:"type"`
    Command  []Command 
}

type Command struct {
    Command string `yaml:"command"`
}

按如下所示修改代码以使其正常工作。

package main

import (
    "fmt"
    "log"

    "gopkg.in/yaml.v2"
)

var runContent = []byte(`
- runners:
  - name: function1
    type:
    - command: spawn child process
    - command: build
    - command: gulp
  - name: function1
    type:
    - command: run function 1
  - name: function3
    type:
    - command: ruby build
  - name: function4
    type:
    - command: go build
`)

type Runners []struct {
    Runners []struct {
        Type []struct {
            Command string `yaml:"command"`
        } `yaml:"type"`
        Name string `yaml:"name"`
    } `yaml:"runners"`
}

func main() {

    runners := Runners{}
    // parse mta yaml
    err := yaml.Unmarshal(runContent, &runners)
    if err != nil {
        log.Fatalf("Error : %v", err)
    }
    fmt.Println(runners)
}

Playground example

在此处https://codebeautify.org/yaml-validator/cb92c85b在线验证您的Yaml