使用 go-jsonnet return 纯 JSON
Using go-jsonnet to return pure 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
}
这个函数目前returns一个字符串,因为jsonnetEvaluateSnippet
函数returns一个字符串
我现在想做的是使用 go-prettyjson 库渲染结果 JSON。但是,因为我输入的 JSON 是一个字符串,所以无法正确呈现。
所以,一些问题:
- 我能否将返回的 JSON 字符串转换为 JSON 类型,而无需事先知道将其编组为什么结构
- 如果没有,我可以用其他方式以漂亮的方式呈现 json 吗?
- 是否有我在这里缺少的选项、函数或方法来使这更容易?
Can I convert the returned JSON string to a JSON type, without knowing beforehand what struct to marshal it into
是的。非常简单:
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。
Is there an option, function or method I'm missing here to make this easier?
是的。 go-prettyjson 库有一个 Format
函数,可以为你解组:
formatted, err := prettyjson.Format([]byte(out))
if err != nil {
log.Panic("Failed to format jsonnet output: ", err)
}
can I render the json in a pretty manner some other way?
取决于你对漂亮的定义。 Jsonnet 通常在单独的行上输出对象的每个字段和每个数组元素。这通常被认为是漂亮的打印(而不是将所有内容都放在同一行上并使用最少的空白以节省几个字节)。我想这对你来说还不够好。您可以在 jsonnet 中编写自己的清单,根据您的喜好对其进行格式化(参见 std.manifestJson 作为示例)。
我正在使用 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
}
这个函数目前returns一个字符串,因为jsonnetEvaluateSnippet
函数returns一个字符串
我现在想做的是使用 go-prettyjson 库渲染结果 JSON。但是,因为我输入的 JSON 是一个字符串,所以无法正确呈现。
所以,一些问题:
- 我能否将返回的 JSON 字符串转换为 JSON 类型,而无需事先知道将其编组为什么结构
- 如果没有,我可以用其他方式以漂亮的方式呈现 json 吗?
- 是否有我在这里缺少的选项、函数或方法来使这更容易?
Can I convert the returned JSON string to a JSON type, without knowing beforehand what struct to marshal it into
是的。非常简单:
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。
Is there an option, function or method I'm missing here to make this easier?
是的。 go-prettyjson 库有一个 Format
函数,可以为你解组:
formatted, err := prettyjson.Format([]byte(out))
if err != nil {
log.Panic("Failed to format jsonnet output: ", err)
}
can I render the json in a pretty manner some other way?
取决于你对漂亮的定义。 Jsonnet 通常在单独的行上输出对象的每个字段和每个数组元素。这通常被认为是漂亮的打印(而不是将所有内容都放在同一行上并使用最少的空白以节省几个字节)。我想这对你来说还不够好。您可以在 jsonnet 中编写自己的清单,根据您的喜好对其进行格式化(参见 std.manifestJson 作为示例)。