Отображать ключи объектов JSON в том же порядке, что и в источнике YAML - PullRequest
0 голосов
/ 11 октября 2018

Я работаю с библиотекой github.com/ghodss/yaml для создания JSON на основе файлов .yaml. У меня возникает ощущение, что 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 голосов
/ 11 октября 2018

Если вы определяете структуру с этими свойствами, маршалер 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}
0 голосов
/ 11 октября 2018

Ваши данные состоят из одного (корневого уровня) отображения и спецификация YAML явно заявляет:

отображение - неупорядоченная ассоциация уникальных ключей со значениями

Библиотека, соответствующая спецификации, загружает это отображение неупорядоченным образом, как и ваша библиотека YAML Go. ¹

Так что ваше ожидание определенно неверно.

Это может быть совпадением, но похоже, что ваш JSON отсортирован по ключу, и это допустимая опция с учетом несортированного ввода.


¹ Единственная библиотека, которую я не знаюДля этого необходимо использовать ruamel.yaml для Python при использовании режима туда и обратно.Используя Python и ruamel.yaml, довольно просто получить вывод, как вы ожидали.

...