Преобразование массива объектов 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 из онлайн-сервиса, он выдает исключение "Невозможно выполнить синтаксический анализ".

1.) Каков правильный способ представления вышеуказанных jsons в YAML?

Я хочу прочитать этот тип YAML в моей программе golang. Для этого я использую библиотеку spf13/viper, но я не смог найти ни одного метода, способного декодировать этот король объектов массива.

2.) Как читать такой YAML в golang с помощью viper? Пример кода поможет.


person Anuruddha    schedule 21.02.2016    source источник
comment
Я не знаю ответа на второй вопрос, но ответ на первый заключается в том, что YAML в вашем вопросе является правильным способом представления JSON в вашем вопросе. Я не знаю, почему связанный сайт выдает ошибку Unable to parse, но вот еще один сайт, у которого нет проблем с ее разбором: yaml-online-parser.appspot.com   -  person Jordan Running    schedule 21.02.2016
comment
Ваш второй вопрос очень расплывчатый. Вы сами что-нибудь пробовали? Если да, то? Вы ничего не пробовали? Какую документацию вы смотрите? В этом файле ознакомительных сведений есть примеры: github.com/spf13/viper/blob/master/README. .мд   -  person d1str0    schedule 21.02.2016


Ответы (2)


Код уродлив, но похоже, что эта библиотека не любит вложенные массивы объектов.

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"])
    }
}
person CrazyCrow    schedule 21.02.2016

Проблема с разбором вашего 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`))
}
person JesusTinoco    schedule 21.02.2016
comment
YAML ОП был совершенно действителен. Удаление начального отступа не делает его более достоверным. Если есть синтаксические анализаторы YAML, которые считают отступ на корневом уровне недопустимым, эти синтаксические анализаторы не соответствуют спецификации YAML. - person Jordan Running; 21.02.2016