以与YAML源中相同的顺序显示JSON对象键

时间:2018-10-11 18:16:49

标签: json go yaml

我正在使用库github.com/ghodss/yaml来创建基于.yaml文件的JSON,但我发现JSON的显示顺序不正确。

这是我的.yaml文件:

name: "Foo"
lastname: "Bar"
age: 25

这是我的GoCode:

for _, file := range yamlfiles {

    yamlBytes, err := ioutil.ReadFile(file)

    if err != nil {
        log.Panicln(err)
    }

    jsonFormat, err := yaml.YAMLToJSON(yamlBytes)

    if err != nil {
        log.Panicln(err)
    }

    fmt.Println(string(jsonFormat))
}

这是输出:

{"age":25,"lastname":"Bar","name":"Foo"}

预期输出:

{"name":"Foo","lastname":"Bar","age":25}

当我拥有.yaml文件时,如何才能按顺序进行此操作?

2 个答案:

答案 0 :(得分:1)

您的数据包含一个(根级别)映射,并且YAML specification明确声明:

  

映射-唯一键与值的无序关联

符合规范的库会以无序方式加载该映射,Go YAML库也是如此。¹

所以您的期望肯定是错误的。

这可能是巧合,但看起来您的JSON是按键排序的,这对于未排序的输入来说是有效的选项。


¹使用往返模式时,我知道唯一不符合此要求的库是ruamel.yaml for Python。使用Python和ruamel.yaml,以您期望的方式获得输出相当简单。

答案 1 :(得分:0)

如果使用这些属性定义结构,则JSON封送拆收器将按定义字段的顺序发出键(Go Playground):

type Person struct {
  Name     string `json:"name"`
  LastName string `json:"lastname"`
  Age      int    `json:"age"`
}

p := Person{"Foo", "Bar", 25}
bs, err := json.Marshal(&p)
if err != nil {
  panic(err)
}

fmt.Println(string(bs))
// {"name":"Foo","lastname":"Bar","age":25}