【问题标题】:Parse Nested YAML Golang解析嵌套的 YAML Golang
【发布时间】:2018-12-21 21:30:39
【问题描述】:

我正在尝试使用 go 解析一个简单的 YAML 文件,但遇到了一些困难。

我的 YAML 文件如下。

key1:
    attr1: "attr1"
    attr2: "attr2"
    attr3: "attr3"
    list1: ["a", "b", "c"]
    list2: ["d", "e", "f"]

我的 go 脚本看起来像这样。

package main

import (
    "fmt"
    "io/ioutil"
    "log"

    "gopkg.in/yaml.v2"
)

type keys struct {
    Key1 map[string]key1 `yaml:"key1"`
}

type key1 struct {
    Attr1 string   `yaml:"attr1"`
    Attr2 string   `yaml:"attr2"`
    Attr3 string   `yaml:"attr3"`
    List1 []string `yaml:"list1"`
    List2 []string `yaml:"list2"`
}

func main() {
    var d keys

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

    if err != nil {
        log.Fatal("Couldn't read yaml file.")
    }

    err = yaml.Unmarshal(source, &d)

    if err != nil {
        log.Fatal("Couldn't parse yaml file.")
    }

    fmt.Println(d)
}

当我运行它时,我的地图是空的({map[]} 被打印)。如果我将键结构更改为 map[string]interface{},它似乎可以获取所有信息,但列表的解释不正确,这就是我尝试定义内部结构的原因。

有谁知道为什么我的 key1 结构不起作用但 interface{} 起作用?

【问题讨论】:

    标签: go yaml


    【解决方案1】:

    你的类型定义:

    type keys struct {
        Key1 map[string]key1 `yaml:"key1"`
    }
    
    type key1 struct {
        Attr1 string   `yaml:"attr1"`
        Attr2 string   `yaml:"attr2"`
        Attr3 string   `yaml:"attr3"`
        List1 []string `yaml:"list1"`
        List2 []string `yaml:"list2"`
    }
    

    隐含这种结构:

    key1:
        stuff:
            attr1: "attr1"
            attr2: "attr2"
            attr3: "attr3"
            list1: ["a", "b", "c"]
            list2: ["d", "e", "f"]
        morestuff:
            attr1: "attr1"
            attr2: "attr2"
            attr3: "attr3"
            list1: ["a", "b", "c"]
            list2: ["d", "e", "f"]
    

    因为,根据您的数据类型,key1 应该包含 结构键的映射 - 向不存在的层次结构添加一个级别。对于您发布的 YAML,您的结构应为:

    type keys struct {
        Key1 key1 `yaml:"key1"`
    }
    
    type key1 struct {
        Attr1 string   `yaml:"attr1"`
        Attr2 string   `yaml:"attr2"`
        Attr3 string   `yaml:"attr3"`
        List1 []string `yaml:"list1"`
        List2 []string `yaml:"list2"`
    }
    

    【讨论】:

      猜你喜欢
      • 2019-01-23
      • 1970-01-01
      • 2017-04-30
      • 2021-11-04
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多