我正在使用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
函数返回一个字符串。
我现在想做的是使用go-prettyjson库渲染结果JSON。但是,由于我输入的JSON是字符串,因此无法正确呈现。
所以,一些问题:
答案 0 :(得分:2)
我是否可以将返回的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#TOC_5。
是否缺少使我更轻松的选项,函数或方法?
是的。 go-prettyjson库具有Format
函数,可为您进行解组:
formatted, err := prettyjson.Format([]byte(out))
if err != nil {
log.Panic("Failed to format jsonnet output: ", err)
}
我可以用其他方式漂亮地渲染json吗?
取决于您对pretty的定义。 Jsonnet通常在单独的一行上输出对象的每个字段和每个数组元素。通常,这被认为是漂亮的打印(而不是将所有内容放在同一行上并使用最小的空白以节省一些字节)。我想这对你来说还不够。您可以在jsonnet中编写自己的清单文件,将其格式化为自己喜欢的格式(请参阅std.manifestJson为例)。