2

我正在使用 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

}

这个函数当前返回一个字符串,因为 jsonnetEvaluateSnippet函数返回一个字符串。

我现在要做的是使用go-prettyjson库渲染结果 JSON。但是,因为我输入的 JSON 是一个字符串,所以它不能正确呈现。

所以,一些问题:

  • 我可以将返回的 JSON 字符串转换为 JSON 类型,而无需事先知道将其编组为什么结构
  • 如果没有,我可以以其他方式以漂亮的方式呈现 json 吗?
  • 有没有我在这里遗漏的选项、功能或方法可以让这更容易?
4

1 回答 1

3

我可以将返回的 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 吗?

取决于你对漂亮的定义。Jsonnet 通常在单独的行上输出对象的每个字段和每个数组元素。这通常被认为是漂亮的打印(而不是将所有内容放在同一行,用最少的空白来节省几个字节)。我想这对你来说还不够好。您可以在 jsonnet 中编写自己的 manifester,根据自己的喜好对其进行格式化(以 std.manifestJson 为例)。

于 2018-06-29T09:56:57.447 回答