【问题标题】:How to parse a yaml of lists in it using golang?如何使用golang解析其中的yaml列表?
【发布时间】:2021-03-12 03:22:15
【问题描述】:

示例 yaml 文件final-result.yml:

- category: 1
  rules:
  - name: a
    results:
    - asset: b
      advice: c

- category: 2
  rules:
  - name: d
    results:
    - asset: e
      advice: f

我尝试将包gopkg.in/yaml.v2 解组:

package main

import (
    "io/ioutil"
    "log"

    "gopkg.in/yaml.v2"
)

type FinalResult struct {
    category string      `yaml:"category"`
    rules    []RulesItem `yaml:"rules,flow"`
}

type RulesItem struct {
    name    string        `yaml:"name"`
    results []ResultsItem `yaml:"results,flow"`
}

type ResultsItem struct {
    asset  string `yaml:"asset"`
    advice string `yaml:"advice"`
}

func main() {
    var result []FinalResult

    content, err := ioutil.ReadFile("final-result.yml")
    if err != nil {
        log.Fatal(err.Error())
        return
    }
    err = yaml.Unmarshal(content, &result)
    if err != nil {
        log.Fatal("Failed to parse file ", err)
    }

    log.Println(result)
}

但它给出了一个空的结果:

[{ []} { []}]

【问题讨论】:

  • 来自docs“结构字段仅在导出时才解组(首字母大写)”。所以开始导出你的变量;例如Category string.

标签: go yaml unmarshalling


【解决方案1】:

根据documentation,您应该公开结构字段,以便解组正确填充数据。:

结构字段仅在导出时才被解组(首字母大写)

在更改类型定义后,您的代码按预期工作:

type FinalResult struct {
    Category string      `yaml:"category"`
    Rules    []RulesItem `yaml:"rules,flow"`
}

type RulesItem struct {
    Name    string        `yaml:"name"`
    Results []ResultsItem `yaml:"results,flow"`
}

type ResultsItem struct {
    Asset  string `yaml:"asset"`
    Advice string `yaml:"advice"`
}

【讨论】:

    猜你喜欢
    • 2017-04-30
    • 2015-11-15
    • 2018-12-21
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 2015-12-31
    • 2015-12-06
    相关资源
    最近更新 更多