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



我将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 的一部分发布。什么时候发布,我希望它具有原来的格式,如果有个字符可以实现。

我可以通过做手动执行此操作

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

但这并不理想。

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"

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

如果你的输入只包含一个 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

最新更新