Golang yaml.v2将数组封送为序列

时间:2018-11-11 15:38:44

标签: go yaml marshalling unmarshalling

给出以下YAML:

array.test: ["val1", "val2", "val3"]

我使用gopkg.in/yaml.v2将其解组为map[string]interface{}。然后,我得到一个键,其值是3个值的数组。

当我再次将其编组到YAML时,生成的YAML如下所示:

array.test:
- val1
- val2
- val3

该数组实际上是作为序列而不是数组编组的。

这是完整的GoLang代码:

func main(){
    data := `array.test: ["val1", "val2", "val3"]`
    conf := make(map[string]interface{})
    yaml.Unmarshal([]byte(data), conf)

    data2, _ := yaml.Marshal(conf)
    fmt.Printf("%s\n", string(data2))
}

我该如何克服这个问题?

3 个答案:

答案 0 :(得分:2)

在与您相同的情况下,这帮助了我。

package main

import (
        "fmt"
        "log"

        "gopkg.in/yaml.v2"
)

var data = `
a: Easy!
b:
c: 2
d.test: ["d1", "d2"]
`

// Note: struct fields must be public in order for unmarshal to
// correctly populate the data.
type T struct {
    A string
    B struct {
            RenamedC int   `yaml:"c"`
            DTest        []string `yaml:"d.test,flow"`
    }
}

func main() {
    // if we use struct containing yaml encoding for yaml formated string 
    t := T{}

    err := yaml.Unmarshal([]byte(data), &t)
    if err != nil {
            log.Fatalf("error: %v", err)
    }
    fmt.Printf("--- t after unmarshal:\n%v\n\n", t)

    d, err := yaml.Marshal(&t)
    if err != nil {
            log.Fatalf("error: %v", err)
    }
    fmt.Printf("--- t after marshal:\n%s\n\n", string(d))
}

参考:https://github.com/go-yaml/yaml

答案 1 :(得分:1)

在结构字段标记格式中使用flow,以表示您需要此行为。但是,当然,这需要对结构进行解编组,而不是对地图进行编组。

答案 2 :(得分:1)

Flow 标签可让您选择Yaml数组的表示形式

package main

import (
    "fmt"
    "gopkg.in/yaml.v2"
)

type Conf struct {
    Test []string `yaml:"array.test,flow"`
}

func main(){
    data := `array.test: ["val1", "val2", "val3"]`
    var conf Conf
    yaml.Unmarshal([]byte(data), &conf)

    data2, _ := yaml.Marshal(conf)
    fmt.Printf("%s\n", string(data2))
}