如何从 json 对象获取格式化的 json 字符串?

She*_*hea 3 bash json jq

我将 的输出存储cat ~/path/to/file/blah | jq tojson在一个变量中,以便稍后在带有 JSON 内容的curl POST 中使用。它工作得很好,但它删除了所有换行符。我知道 JSON 不支持换行符,但我希望将它们替换为\n字符,这样当使用数据时,它就不全是一行。

有没有办法做到这一点?

例子:

{
  "test": {
     "name": "test",
     "description": "blah"
  },
  "test2": {
     "name": "test2",
     "description": "blah2" 
  }
}
Run Code Online (Sandbox Code Playgroud)

变成

"{\"test\":{\"name\":\"test\",\"description\":\"blah\"},\"test2\":{\"name\":\"test2\",\"description\":\"blah2\"}}"
Run Code Online (Sandbox Code Playgroud)

但我希望它看起来像

{\n  \"test\": {\n    \"name\": \"test\",\n    \"description\": \"blah\"\n  },\n  \"test2\": {\n    \"name\": \"test2\",\n    \"description\": \"blah2\" \n  }\n}
Run Code Online (Sandbox Code Playgroud)

实际上,我只是将其转换为 JSON 字符串,以便可以将其作为另一个 JSON 的一部分发布。当它发布时,我希望它具有最初的格式,如果有 \n 字符就可以实现。

我可以通过以下方式手动执行此操作

cat file | sed -E ':a;N;$!ba;s/\r{0,1}\n/\\n/g' | sed 's/\"/\\"/g')

但这并不理想。

Jef*_*ado 5

tojson(或其他 json 输出过滤器)不会格式化 json。它将采用通常的紧凑形式。有一个功能请求,因此请在未来版本中留意。

您可以利用 jq 的常规格式化输出,但您需要将其字符串化。您可以通过将格式化输出作为原始输入来模拟字符串化。这会将所有输入作为单个字符串读入。由于输入只是一个 json 对象,因此它将生成该对象的字符串表示形式。

如果您不介意额外的 jq 调用,您可以这样做:

$ var=$(jq '.' input.json | jq -sR '.')
$ echo "$var"
"{\n  \"test\": {\n    \"name\": \"test\",\n    \"description\": \"blah\"\n  },\n  \"test2\": {\n    \"name\": \"test2\",\n    \"description\": \"blah2\"\n  }\n}\n"
Run Code Online (Sandbox Code Playgroud)

当然,如果您的输入已经格式化,您可以省略第一个 jq 调用。