Голанг yaml.v2 маршалирует массив как последовательность - PullRequest
0 голосов
/ 11 ноября 2018

Учитывая следующее 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 голосов
/ 11 ноября 2018
Тег

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))
}
0 голосов
/ 11 ноября 2018

Этот помог мне в том же деле, что и вы.

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

0 голосов
/ 11 ноября 2018

Используйте flow в формате тега struct field, чтобы указать, что вы хотите этого поведения. Но, конечно, для этого требуется демаршалинг структуры, а не карты.

...