Преобразование массива объектов JSON в YAML
У меня есть следующий JSON, который необходимо преобразовать в YAML
{
"siteidparam": "lid",
"sites": [
{
"name": "default",
"routingmethod": {
"method": "urlparam",
"siteid": "default",
"urlpath": "default"
}
},
{
"name": "csqcentral",
"routingmethod": {
"method": "urlparam",
"siteid": "capitolsquare",
"urlpath": "csq"
}
}
]
}
Я использовал онлайн конвертер JSON в YAML, и он дал следующий вывод,
---
siteidparam: "lid"
sites:
-
name: "default"
routingmethod:
method: "urlparam"
siteid: "default"
urlpath: "default"
-
name: "csqcentral"
routingmethod:
method: "urlparam"
siteid: "capitolsquare"
urlpath: "csq"
когда я пытался преобразовать тот же сгенерированный YAML обратно в json из онлайн-сервиса, это выдает исключение "Unable to parse".
1.) Как правильно представлять вышеуказанные jsons в YAML?
Я хочу читать этот вид YAML в моей программе golang. Для этого я использую библиотеку spf13/viper, но я не смог найти какой-либо метод, способный декодировать этот король объектов массива.
2.) Как читать этот вид YAML на Голанге, используя viper? Пример кода поможет.
3 ответа
Код некрасив, но, похоже, эта библиотека не похожа на вложенные массивы объектов.
package main
import (
"bytes"
"fmt"
"github.com/spf13/viper"
)
func main() {
viper.SetConfigType("yaml")
var yamlExample = []byte(`---
siteidparam: "lid"
sites:
-
name: "default"
routingmethod:
method: "urlparam"
siteid: "default"
urlpath: "default"
-
name: "csqcentral"
routingmethod:
method: "urlparam"
siteid: "capitolsquare"
urlpath: "csq"`)
viper.ReadConfig(bytes.NewReader(yamlExample))
fmt.Printf("%s\n", viper.GetString("siteidparam"))
sites := viper.Get("sites").([]interface{})
for i, _ := range sites {
site := sites[i].(map[interface{}]interface{})
fmt.Printf("%s\n", site["name"])
routingmethod := site["routingmethod"].(map[interface{}]interface{})
fmt.Printf(" %s\n", routingmethod["method"])
fmt.Printf(" %s\n", routingmethod["siteid"])
fmt.Printf(" %s\n", routingmethod["urlpath"])
}
}
Проблема с разбором YAML в JSON заключается в том, что в каждом элементе есть два пробела. Должно быть так:
---
siteidparam: "lid"
sites:
-
name: "default"
routingmethod:
method: "urlparam"
siteid: "default"
urlpath: "default"
-
name: "csqcentral"
routingmethod:
method: "urlparam"
siteid: "capitolsquare"
urlpath: "csq"
О вашем втором вопросе найдите ниже простой фрагмент о том, как этого добиться:
package main
import (
"bytes"
"fmt"
"github.com/spf13/viper"
)
func main() {
viper.SetConfigType("yaml") // or viper.SetConfigType("YAML")
var yamlExample2 = []byte(`
---
siteidparam: "lid"
sites:
-
name: "default"
routingmethod:
method: "urlparam"
siteid: "default"
urlpath: "default"
-
name: "csqcentral"
routingmethod:
method: "urlparam"
siteid: "capitolsquare"
urlpath: "csq"
`)
viper.ReadConfig(bytes.NewBuffer(yamlExample2))
fmt.Println(viper.Get(`sites`))
}
yq можно использовать для конвертации между JSON и YAML.
Конвертировать JSON в YAML
yq -o yaml --prettyPrint
siteidparam: lid
sites:
- name: default
routingmethod:
method: urlparam
siteid: default
urlpath: default
- name: csqcentral
routingmethod:
method: urlparam
siteid: capitolsquare
urlpath: csq
Преобразование YAML обратно в JSON
yq -o json --prettyPrint
{
"siteidparam": "lid",
"sites": [
{
"name": "default",
"routingmethod": {
"method": "urlparam",
"siteid": "default",
"urlpath": "default"
}
},
{
"name": "csqcentral",
"routingmethod": {
"method": "urlparam",
"siteid": "capitolsquare",
"urlpath": "csq"
}
}
]
}
(XML и файлы свойств также можно преобразовать с помощьюyq
)