将yaml文件解析为go中的预定义结构
我有多个需要解析的yaml文件,它们的结构完全相同将yaml文件解析为go中的预定义结构,go,struct,yaml,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
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
依赖项标记可以(或不可以)包含带有名称的安装
部分
和属性
,这是必需的
依赖项标记可以(或不可以)包含提供节和名称
这是强制性的
安装可以有属性,提供的也可以有属性
性质
我正在使用a解析文件,但我的问题是如何在Golang中构建结构,当我解析文档时,它将自动填充主结构并包含子结构(例如依赖项/安装部分)
我试过类似的东西
type main struct {
schema struct {
schema string
id int
version string
}
dependency struct {
name string
type string
cwd string
install struct {
name string
}
}
在install部分,它可以是group或type,也可以是group或type,也可以是properties部分,所以我不确定如何构建
我用来解析文档的一些通用/可扩展结构(文档有一系列属性,我在示例中介绍了大多数选项)
我使用这个库来解析文档
您的结构定义应该是这样的
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)
与
您的结构定义应该是这样的
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)
与
谢谢1+,你能提供一个例子,你会如何解析这个结构的答案中的文件吗?非常感谢,我已经尝试了你的例子,它部分工作。安装
属性
提供的
对象是空的,知道吗?很抱歉,这没问题是vs代码调试器,它似乎没有在deep struct中显示对象…查看我的更新,您无法打开数组对象查看其中的内容我的最后一个问题:)如果您需要构建这个golang程序,您将如何构造项目,让我们假设main位于rootProj->cmd>main下。转到您将所有的“struct”放在哪里(项目中的哪个文件夹,如果为每个结构创建新文件…)以及如何将它们加载到主方法中。非常感谢!如果应用程序仅限于此问题描述,您可以将其保存在一个文件中。应用程序的最终设计应取决于您的全部要求和复杂性。这感觉像是另一个问题,而且过于笼统。请将其与另一个StackOverflow问题分开d提供更多细节。感谢1+,您能提供示例如何解析此结构的答案中的文件吗?非常感谢,我尝试了您的示例,它部分工作。安装
属性
提供
对象为空,有什么想法吗?很抱歉,这没问题,问题是vs code debugg呃,它似乎没有在deep struct中显示对象…请看我的更新,您无法打开数组对象查看其中的内容我的最后一个问题:)如果您需要构建这个golang程序,您将如何构造项目,让我们假设main位于rootProj->cmd>main下。go
您将所有的“struct”放在哪里(项目中的哪个文件夹,如果为每个结构创建新文件…)以及如何将它们加载到主方法中。非常感谢!如果应用程序仅限于此问题描述,您可以将其保存在一个文件中。应用程序的最终设计应取决于您的全部要求和复杂性。这感觉像是另一个问题,而且过于笼统。请将其与另一个StackOverflow问题分开d提供更多细节。