我有时需要编写包含字符串值的 JSON 字符串,该字符串本身就是一个 JSON 字符串。例如在以下 JSON 对象中:
echo '{"rec" : " {\"id\": 1, \"name\": \"x\"}" }' | jq .
{
"rec": " {\"id\": 1, \"name\": \"x\"}"
}
处的值"rec"
是字符串形式的json {\"id\": 1, \"name\": \"x\"}"
。
编写这种转义的 json 字符串非常繁琐,因为需要将每个双引号转义"
为\"
。
我的问题是:
给定内容{ "id": 1, "name": "x"}
,是否有一种使用 bash/jq 的自动方法可以正确地转义引号并获取可用作 JSON 字符串值的引号形式 "{\"id\": 1, \"name\": \"x\"}"
?
基本上有两种方法。
将 JSON 负载
jq
作为字符串赋值:请注意,
jq
不会以任何方式验证所提供的字符串,并且会保留其原样,包括过多的空格和所有内容。将
jq
有效负载作为输入 JSON 文档并使用tojson
对其进行字符串化:这里,
jq
如果给定的 JSON 片段无效,就会发出警告,并且它还会通过删除不必要的空格来“压缩”它。同样的事情,但是从标准输入读取:
input
和之间的区别inputs
在于input
从 的输入读取单个对象jq
,而inputs
读取所有剩余的对象。tojson
或者,由于它更短,通过删除-n
/选项直接将输入拉入--null-input
:这将从 的输入中获取所有数据
jq
(就像使用 时一样inputs
,使用),并通过 将-n
其作为键的值插入。rec
tojson
要执行相反的操作,即解码字符串化的有效负载,请使用
fromjson
:请注意
echo
,一般来说,并不是将 JSON 文档传递给jq
(或其他任何地方)的最佳实用程序,因为根据您的 shell 及其配置,它可能会选择将\n
和之类的字符串扩展\t
为文字换行符和制表符,这会破坏所提供文档的格式。用于
--arg
传递文字字符串,它将成为 jq 中的 $变量: