根据 JSON 规范,正斜杠不必用反斜杠转义,但可以。
我有一个 JSON 文件,其中出于兼容原因(但不在键内)转义了字符串值中的所有正斜杠:
{
"proto://some/path": "\/\/some\/path"
}
但是,jq
自动删除这些反斜杠:
$ echo '{"proto://some/path":"\/\/some\/path"}' | jq -c .
{"proto://some/path":"//some/path"}
我需要输出是{"proto://some/path":"\/\/some\/path"}
我怎么知道jq
不要更改任何字符串值并保留这些反斜杠?或者,有没有办法在它通过后将
这些反斜杠仅重新添加到值中jq
?
如果你能的话,我会感到惊讶。
jq
解码其输入,执行其操作并将结果对象编码为 json。\
编码输出时,输出的是那些JSON编码的字符串, s前面有s的信息/
早就丢失了。如果那些/
最初写的 s也会发生同样的情况\u002f
。您会发现出于同样的原因,它jq
也会重新格式化1.0
为1
、1e2
as100
、INF
as等。1.7976931348623157e+308
然而,JSON 是一种相对容易的文件格式,可以使用例如 perl 正则表达式手动可靠地处理。
要在除对象键之外的所有字符串中的
\
每个字符串之前添加s,您可以执行以下操作:/
即使您有嵌入
"
s 和\
s 的字符串(如{"key": "//\"//\\"}
),它也应该可以正常工作。作为 的替代方案
jq
,您可以使用 JSON::PPperl
模块,它可以被告知转义斜杠(尽管会出现在所有字符串中):如果您已经熟悉
perl
,那么学习曲线就不会比必须学习jq
语法那么陡峭。在任何情况下,虽然 JSON 格式允许
/
将 s 转义为\/
(或\u002f
像任何字符一样)那些不需要的。根据我在网上阅读的内容,这是允许的,因此可以通过编写将包含</
在 HTML标记中的 JSON 字符串嵌入. 这就是为什么一些 JSON 编码器将它们编码为更便携的原因。但是,如果该 JSON 不打算像在 HTML 中那样嵌入,那么它可能并不重要。如果是这样,您可能希望在任何地方都使用该编码,包括在对象键中。<script>
"<\/whatever"
\/
/
我假设一些不知道需要在 JSON 中编码字符串的进程已经插入了他们认为需要存储的文字字符串,但没有对其进行编码。
jq
由于反斜杠是不需要转义的转义字符,并且由于没有反斜杠本身对文字反斜杠进行转义,因此当用于提取和解码字符串或出于其他原因处理文档时,它们将看起来“消失” 。简而言之,正斜杠不必转义(转义它们实际上是一个空操作),但如果你想将它们保留为文字反斜杠,则反斜杠需要转义。
以下将递归地将文档中所有字符串值中的每个更改
/
为\\/
(这是您在 JSON 字符串中的写入方式)。\/
请记住,当jq
表达式处理数据时,jq
解析器已经删除了反斜杠。对于给定的示例文档,这将生成
从修改后的文档中提取和解码编码字符串值将为您提供
\/\/some\/path
:如果您像这样从头开始创建它,您将得到相同的 JSON 文档: