Использование go-jsonnet для возврата чистого JSON

Я использую библиотеку Google go-jsonnet для оценки некоторых файлов jsonnet.

У меня есть такая функция, которая рендерит документ Jsonnet:

// Takes a list of jsonnet files and imports each one and mixes them with "+"
func renderJsonnet(files []string, param string, prune bool) string {

  // empty slice
  jsonnetPaths := files[:0]

  // range through the files
  for _, s := range files {
    jsonnetPaths = append(jsonnetPaths, fmt.Sprintf("(import '%s')", s))
  }

  // Create a JSonnet VM
  vm := jsonnet.MakeVM()

  // Join the slices into a jsonnet compat string
  jsonnetImport := strings.Join(jsonnetPaths, "+")

  if param != "" {
    jsonnetImport = "(" + jsonnetImport + ")" + param
  }

  if prune {
    // wrap in std.prune, to remove nulls, empty arrays and hashes
    jsonnetImport = "std.prune(" + jsonnetImport + ")"
  }

  // render the jsonnet
  out, err := vm.EvaluateSnippet("file", jsonnetImport)

  if err != nil {
    log.Panic("Error evaluating jsonnet snippet: ", err)
  }

  return out

}

Эта функция в настоящее время возвращает строку, потому что jsonnet EvaluateSnippet функция возвращает строку.

Теперь я хочу визуализировать этот результат в формате JSON с помощью библиотеки go-prettyjson. Тем не менее, поскольку JSON, который я передаю, является строкой, он не рендерится правильно.

Итак, несколько вопросов:

  • Могу ли я преобразовать возвращенную строку JSON в тип JSON, не зная заранее, в какую структуру ее упорядочить
  • если нет, могу ли я сделать рендеринг JSON каким-то другим способом?
  • Есть ли здесь опция, функция или метод, которые мне не хватает, чтобы сделать это проще?

1 ответ

Решение

Могу ли я преобразовать возвращенную строку JSON в тип JSON, не зная заранее, в какую структуру ее упорядочить

Да. Это очень просто:

var jsonOut interface{}
err := json.Unmarshal([]byte(out), &jsonOut)
if err != nil {
    log.Panic("Invalid json returned by jsonnet: ", err)
}
formatted, err := prettyjson.Marshal([]byte(jsonOut))
if err != nil {
    log.Panic("Failed to format jsonnet output: ", err)
}

Более подробная информация здесь: https://blog.golang.org/json-and-go.

Есть ли здесь опция, функция или метод, которые мне не хватает, чтобы сделать это проще?

Да. Библиотека go-prettyjson имеет Format функция, которая выполняет демаршаллинг для вас:

formatted, err := prettyjson.Format([]byte(out))
if err != nil {
    log.Panic("Failed to format jsonnet output: ", err)
}

Могу ли я сделать рендеринг JSON другим способом?

Зависит от вашего определения довольно. Обычно Jsonnet выводит каждое поле объекта и каждого элемента массива в отдельной строке. Обычно это считается хорошей печатью (в отличие от размещения одной строки с минимальным пробелом для экономии нескольких байтов). Я полагаю, это не достаточно хорошо для вас. Вы можете написать свой собственный манифест в jsonnet, который отформатирует его по своему вкусу (см. Пример std.manifestJson).

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