Преобразование массива объектов 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)

Другие вопросы по тегам