我正在使用库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文件时,如何才能按顺序进行此操作?
答案 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}