如何解组 yaml 数组?

atl*_*ine 4 yaml go

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

- {"foo": "1", "bar": "2"}
Run Code Online (Sandbox Code Playgroud)

然后,我编写一段代码来解析该值12从此 yaml 中解析,如下所示:

测试.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)
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,如下所示:

shubuntu1@shubuntu1:~/20210810$ go run test.go
--- configs:
{[{1 2}]}

1
2
Run Code Online (Sandbox Code Playgroud)

有什么问题?

您可以看到我在这里做了一个解决方法,接下来foobar在原始 yaml 之前添加特殊键,然后我可以用来type Configs struct解组它:

- foo: 1
  bar: 2
Run Code Online (Sandbox Code Playgroud)

foobar:
- foo: 1
  bar: 2
Run Code Online (Sandbox Code Playgroud)

那么,如果我不使用解决方法添加前缀foobar:,我该如何直接解析呢- {"foo": 1, "bar": 2}

Kam*_*san 5

由于您的YAML数据是一个数组,因此将其解组为Config结构数组。

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)
}

Run Code Online (Sandbox Code Playgroud)

输出:

[{1 2}]
Run Code Online (Sandbox Code Playgroud)

试穿 - Go Playground

  • 太棒了,这么简单的解决方案我错过了,谢谢~ (2认同)