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

时间:2017-07-13 01:06:10

标签: json bash jq

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

有办法做到这一点吗?

示例:

{
  "test": {
     "name": "test",
     "description": "blah"
  },
  "test2": {
     "name": "test2",
     "description": "blah2" 
  }
}

变为

"{\"test\":{\"name\":\"test\",\"description\":\"blah\"},\"test2\":{\"name\":\"test2\",\"description\":\"blah2\"}}"

但我希望它看起来像

{\n  \"test\": {\n    \"name\": \"test\",\n    \"description\": \"blah\"\n  },\n  \"test2\": {\n    \"name\": \"test2\",\n    \"description\": \"blah2\" \n  }\n}

我实际上只将其转换为JSON字符串,因此可以将其作为另一个JSON的一部分发布。什么时候发布,我希望它有原来的格式,如果有\ n个字符就可以实现。

我可以通过

手动执行此操作

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

但这并不理想。

2 个答案:

答案 0 :(得分:1)

tojson(或其他json输出过滤器)不会格式化json。它将采用通常的紧凑形式。这里有一个feature request,所以在未来的版本中请注意这一点。

您可以利用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"

当然,如果你的输入已经格式化,你可以省去第一个jq电话。

答案 1 :(得分:0)

如果你的输入只包含一个JSON值,那么jq并不是真的在这里买你:你需要的只是逃避JSON中有效的几个字符,但不要用JSON字符串表示自己,您可以使用命令行实用程序轻松地进行通用字符串处理。

例如:

perl -wpe '
    s/\\/\\<backslash>/g;
    s/\t/\\t/g;
    s/\n/\\n/g;
    s/\r/\\r/g;
    s/"/\\"/g;
    s/\\<backslash>/\\\\/g
' ~/path/to/file/blah