使用 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 是一个字符串,所以无法正确呈现。

所以,一些问题:

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 作为示例)。