【问题标题】:Unmarshal YAML returns incomplete resultUnmarshal YAML 返回不完整的结果
【发布时间】:2020-06-05 11:52:09
【问题描述】:

输入 Yaml:

params: 
  - aws.region: ["us-west-1","us-west-2"]
  - aws.s3path: ["s3-path-1", "s3-path-2"]

代码:

package main

import (
    "fmt"
    "io/ioutil"
    "os"

    "gopkg.in/yaml.v2"
)

func main() {  
    var f File
    wfyaml, _ := os.Open("temp.yaml")
    byteValue, _ := ioutil.ReadAll(wfyaml)
    yaml.Unmarshal(byteValue, &f)
    fmt.Print(f)
}

type File struct {
    Params Params `yaml:"params"`
}

type Params []struct { // <<< This [] behavior is confusing
    AwsRegion []string `yaml:"aws.region"`
    S3path    []string `yaml:"aws.s3path"`
}

输出:

{[{[us-west-1 us-west-2] []} {[] [s3-path-1 s3-path-2]}]}%   

如果我使用

type Params struct { // <<< This [] behavior is confusing
        AwsRegion []string `yaml:"aws.region"`
        S3path    []string `yaml:"aws.s3path"`
    }

那么输出就是{{[] []}}%

我不确定我是否在这里遗漏了什么。

【问题讨论】:

  • 你想达到什么输出? YAML 输入是否严格,即您不能更改其格式?或者您希望项目切片列表在一个结构中 - 而不是一个结构切片?

标签: go yaml


【解决方案1】:

行为与 YAML 输入一致:

params: 
  - aws.region: ["us-west-1","us-west-2"]
  - aws.s3path: ["s3-path-1", "s3-path-2"]

在上面,params 是一个数组,因为它的元素以 - 开头。每个- 是一个数组元素,由于每个元素都有一个键,param 是一个对象数组。第一个元素是键为aws.region 的对象,第二个元素是键为aws.s3path 的对象。这些对象本身就是字符串数组。

【讨论】:

    【解决方案2】:

    这是因为您输入的 yaml 中的 params 是一个数组。

    如果您将输入 yaml 更改为以下内容,那么您会发现带有 type Params struct 的代码可以正常工作,因为在这种情况下 params 不再是数组。

    params:
        aws.region: ["us-west-1","us-west-2"]
        aws.s3path: ["s3-path-1", "s3-path-2"]
    

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多