Использование 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).