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

我有下一个yaml,如果我在在线yaml网站上验证它,它说它是有效的:

- {"foo": "1", "bar": "2"}

然后,我编写一个代码来解析该值,并从这个yaml中分析如下:12

测试.go

package main

import "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}]}


1

2

怎么了?


你可以看到我在这里做了一个解决方法,因为接下来在原始的yaml之前添加特殊键,然后我可以用来取消封送:foobartype Configs struct



- foo: 1

  bar: 2


foobar:

- foo: 1

  bar: 2

因此,如果我不使用解决方法来添加前缀,我怎么能直接解析?foobar:- {"foo": 1, "bar": 2}


慕尼黑的夜晚无繁华
浏览 99回答 2
2回答

天涯尽头无女友

由于您的数据是一个数组,因此请将其取消封送至结构数组。YAMLConfigpackage mainimport (    "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}]试穿 - 去游乐场

GCT1015

由于这个问题已经得到回答,我想我可以在讨论中添加一些东西:    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最好是从单独的文件加载以避免此类问题。datapackage mainimport (    "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}]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go