go - 将 GO YAML 解码为 Map 或 String

标签 go yaml

我正在尝试解码 YAML 条目,这些条目可以是字符串或键列表:值字符串(根据 Go 的映射)。我无法弄清楚如何悲伤地完成这项工作。我知道我可以编写自己的解码器,但这似乎只适用于结构。

我有第一部分工作:

package main

import (
    "log"

    "gopkg.in/yaml.v2"
)

type Data struct {
    Entry []Entry `yaml:"entries"`
}

type Entry map[string]string

var dat string = `
entries: 
  - keya1: val1
    keya2: val2
  - keyb1: val1
    keyb2: val2
  - val3`

func main() {
    out := Data{}
    if err := yaml.Unmarshal([]byte(dat), &out); err != nil {
        log.Fatal(err)
    }

    log.Printf("%+v", out)
}

但显然 - val3 条目现在会导致错误。我怎样才能让它识别列表和单个字符串条目?

谢谢

最佳答案

这只是优秀的@Benjamin Kadish answer above 的后续,但这里有一个更完整的版本,它使用 yaml.v3,这使得它更加明显。请注意,解码项的类型是 map[string]interface{} 而不是 yaml v3 中的 map[interface{}]interface{}


package main

import (
    "gopkg.in/yaml.v3"
    "log"
)

type Data struct {
    Entry []Entry `yaml:"entries"`
}

type Entry interface {}

var dat string = `
entries: 
  - keya1: val1
    keya2: val2
  - keyb1: val1
    keyb2: val2
  - val3`

func main() {
    out := Data{}
    if err := yaml.Unmarshal([]byte(dat), &out); err != nil {
        log.Fatal(err)
    }

    for _, entry := range out.Entry {

        switch i := entry.(type) {
        case string:
            log.Printf("i is a string: %+v\n", i)
        case map[string]interface{}:
            log.Printf("i is a map.")
            for k,v := range i {
                log.Printf("%s=%v\n",k,v)
            }
        default:
            log.Printf("Type i=%s", i)
        }
    }
}


关于go - 将 GO YAML 解码为 Map 或 String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48569309/

相关文章:

go - 为什么 time.Since 在 Windows 上返回负持续时间?

rust - 在 Rust 中迭代 yaml 数组

Symfony2 - 环境 - 无法从公共(public)文件夹导入 routing.yml

go - 如何绑定(bind)到 go (gin) 形式的 slice 值?

go - 在 go 程序退出后,在 shell 上保留为 env 变量设置的值

go - 如何在Goroutine中处理错误

java - 多键 -> 值映射的配置文件选项

go - 如何在 go 中发送带有网络凭据的 https/http 请求

kubernetes - Helm 图表失败并显示所需值

linux - 通过 Azure Devops 将 .Net Core 3.1 Web 应用部署到 Azure Linux Web 服务时出错