我有多个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
答案 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)