使用go-jsonnet返回纯JSON

时间:2018-06-28 21:56:16

标签: json go jsonnet

我正在使用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是字符串,因此无法正确呈现。

所以,一些问题:

  • 我是否可以将返回的JSON字符串转换为JSON类型,而无需事先知道将其编组为什么结构
  • 如果没有,我可以通过其他方式漂亮地渲染json吗?
  • 是否缺少使我更轻松的选项,函数或方法?

1 个答案:

答案 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为例)。