将yaml文件解析为go中的预定义结构

时间:2017-12-11 09:46:30

标签: go struct yaml

我有多个yaml文件需要解析并具有完全相同的结构

schema: "1.0.0"
id: test
version: "1.2.3"


dependency :
  - name: ui
    type: runner
    cwd: /ui
    install:
       - name: api
         group: test
         properties:
             name: app
             url: appUrl

  - name: backend
    type: mongoDb
    path: be
    install:
       - name: db
         type: mongo
    provides:
       - name: api
         properties:
            url: url
  

架构部分对于应用应该应用的所有yaml都是必需的   总是

     

依赖项标记可以包含带有必填字段的1..n条目   ,名称,类型,cwd

     

依赖关系标记可以(或不包含)install部分包含name   和properties这是强制性的

     

依赖关系标记可以(或不包含)provides部分包含name   哪个是强制性的

     

安装可以具有属性,也可以提供   特性

我使用yaml parser来解析文件,但我的问题是Golang中我如何构建struct,当我解析doc时它会自动填充主结构并包含子结构(如依赖) /安装部分)

我尝试了类似

的内容
type main struct {
    schema struct {
        schema  string
        id int
        version string
    }

    dependency struct {
        name  string
        type string
        cwd string

    install struct {
        name  string
    }


}

在安装部分,它可以是组或类型或两者,它也可以有属性部分,所以我不知道如何构建 我用来解析文档的一些通用/可扩展结构(文档有很近的属性列表,我在示例中描述了最多的选项)

我使用这个lib来解析doc

yaml parser

enter image description here

1 个答案:

答案 0 :(得分:1)

您的结构定义应该是这样的

type Yaml struct {
    Schema     string
    ID         string
    Version    string
    Dependency []Dependency
}

type Dependency struct {
    Name     string
    Type     string
    CWD      string
    Install  []Install
    Provides []Provide
}

type Install struct {
    Name       string
    Group      string
    Type       string
    Properties Properties
}

type Properties struct {
    Name string
    URL  string
}

type Provide struct {
    Name       string
    Properties Properties
}

以下是完整的示例代码:

package main

import (
    "fmt"
    "io/ioutil"
    "log"

    "gopkg.in/yaml.v2"
)

var data = `
schema: "1.0.0"
id: test
version: "1.2.3"


dependency :
  - name: ui
    type: runner
    cwd: /ui
    install:
       - name: api
         group: test
         properties:
             name: app
             url: appUrl

  - name: backend
    type: mongoDb
    path: be
    install:
       - name: db
         type: mongo
    provides:
       - name: api
         properties:
             url: url
`

type Yaml struct {
    Schema     string
    ID         string
    Version    string
    Dependency []Dependency
}

type Dependency struct {
    Name     string
    Type     string
    CWD      string
    Install  []Install
    Provides []Provide
}

type Install struct {
    Name       string
    Group      string
    Type       string
    Properties Properties
}

type Properties struct {
    Name string
    URL  string
}

type Provide struct {
    Name       string
    Properties Properties
}

func main() {
    y := Yaml{}

    err := yaml.Unmarshal([]byte(data), &y)
    if err != nil {
        log.Fatalf("error: %v", err)
    }
    fmt.Printf("%+v\n", y)

}

输出

{Schema:1.0.0 ID:test Version:1.2.3 Dependency:[{Name:ui Type:runner CWD:/ui Install:[{Name:api Group:test Type: Properties:{Name:appURL:appUrl}}] Provides:[]} {Name:backend Type:mongoDb CWD: Install:[{Name:db Group: Type:mongo Properties:{Name: URL:}}] Provides:[{Name:api Properties:{Name: URL:url}}]}]}

如果你想从yaml文件中读取,只需在主函数中替换:

err := yaml.Unmarshal([]byte(data), &y)

yamlFile, err := ioutil.ReadFile("yaml_sample.yaml")
if err != nil {
    log.Printf("yamlFile.Get err   #%v ", err)
}
err = yaml.Unmarshal(yamlFile, &y)
相关问题