为了账号安全,请及时绑定邮箱和手机立即绑定

如何取消封送一个 yaml 数组?

如何取消封送一个 yaml 数组?

Go
慕尼黑的夜晚无繁华 2022-09-19 17:33:22
我有下一个yaml,如果我在在线yaml网站上验证它,它说它是有效的:- {"foo": "1", "bar": "2"}然后,我编写一个代码来解析该值,并从这个yaml中分析如下:12测试.go:package mainimport "gopkg.in/yaml.v2"import "fmt"type Config struct {    Foo string    Bar string}type Configs struct {    Cfgs []Config `foobar`}func main() {    //var data = `    //  foobar:    //  - foo: 1    //    bar: 2    //`    var data = `      - foo: 1        bar: 2    `    source := []byte("foobar:" + data)    var configs Configs    err := yaml.Unmarshal(source, &configs)    if err != nil {        fmt.Println("error: %v", err)    }    fmt.Printf("--- configs:\n%v\n\n", configs)    fmt.Println(configs.Cfgs[0].Foo)    fmt.Println(configs.Cfgs[0].Bar)}它的工作原理如下:shubuntu1@shubuntu1:~/20210810$ go run test.go--- configs:{[{1 2}]}12怎么了?你可以看到我在这里做了一个解决方法,因为接下来在原始的yaml之前添加特殊键,然后我可以用来取消封送:foobartype Configs struct从- foo: 1  bar: 2自foobar:- foo: 1  bar: 2因此,如果我不使用解决方法来添加前缀,我怎么能直接解析?foobar:- {"foo": 1, "bar": 2}
查看完整描述

2 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

由于您的数据是一个数组,因此请将其取消封送至结构数组。YAMLConfig


package main


import (

    "fmt"


    "gopkg.in/yaml.v2"

)


type Config struct {

    Foo string

    Bar string

}


func main() {

    var configs []Config


    var data = `

      - foo: 1

        bar: 2

    `


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

    if err != nil {

        panic(err)

    }


    fmt.Println(configs)

}


输出:


[{1 2}]

试穿 - 去游乐场


查看完整回答
反对 回复 2022-09-19
?
GCT1015

TA贡献1827条经验 获得超4个赞

由于这个问题已经得到回答,我想我可以在讨论中添加一些东西:


    var data = `

      - foo: 1

        bar: 2

    `

此处的数据变量(即您编写的方式)将包括每行开头的缩进。


这里的额外缩进将与所有实际的 yaml 数据一起传递,这可能会把事情搞砸,因为 gofmt 将代码格式化为使用 TAB 作为缩进,并且 yaml 中禁止 TAB 缩进(https://stackoverflow.com/a/19976827/7509248)。yaml.Unmarshal()


如果您在 yaml 中使用 tab 作为缩进,则在尝试取消封送时会引发这样的错误:


yaml: line 1: found a tab character that violates indentation

最好是从单独的文件加载以避免此类问题。data


package main


import (

    "fmt"

    "io/ioutil"


    "gopkg.in/yaml.v2"

)


type Config struct {

    Foo string

    Bar string

}


func main() {

    var configs []Config


    source, err := ioutil.ReadFile("config.yaml")

    if err != nil {

        fmt.Printf("failed reading config file: %v\n", err)

    }


    err = yaml.Unmarshal(source, &configs)

    if err != nil {

        fmt.Printf("error: %v\n", err)

    }


    fmt.Printf("config:\n%+v\n", configs)

}

config.yaml:


- foo: 1

  bar: 2

输出:


config:

[{Foo:1 Bar:2}]


查看完整回答
反对 回复 2022-09-19
  • 2 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信