使用jq解析含转义反斜杠的JSON数组元素时出现解析错误,求正确处理方法
使用jq解析含转义反斜杠的JSON数组元素时出现解析错误,求正确处理方法
嗨,这个问题我太熟了!你踩的坑本质是shell的read命令在搞鬼——它默认会把反斜杠当成转义符处理,导致传给第二个jq的内容已经不是正确的JSON格式了。咱们来一步步搞定它:
最优解:全程用jq处理,避开shell干扰
其实完全不用拆成jq + shell循环 + jq的复杂流程,jq本身就能直接完成你想要的操作,还不会有转义问题。直接运行这条命令就行:
jq -r '.[][0]' input.json
简单解释下:
.[]遍历外层数组里的每一个子数组.[0]取出每个子数组的第一个元素-r选项让jq输出原始字符串(不带JSON的引号包裹)
用你的input.json测试,直接就能得到正确的\结果,完美避开shell的转义坑。
如果必须用shell循环处理(比如还要做其他shell操作)
要是你确实需要把每个JSON元素拿出来在shell里做额外处理,那得给read加个关键选项-r,关闭它的反斜杠转义功能。修改后的脚本如下:
jq -c '.[]' input.json | while read -r pair; do echo "$pair" | jq -r '.[0]' done
这里的-r是核心:它让read原封不动地读取jq输出的所有内容,包括反斜杠,不会把\\偷偷转成单个\。这样传给第二个jq的就是标准的JSON格式,自然不会再触发解析错误。
为啥原来的写法会出错?
你原来的脚本里,read没有加-r,它会把jq输出的["\\", "bslash.jpg"]里的\\解析成单个\,导致第二个jq拿到的内容变成了["\", "bslash.jpg"]——这根本不是合法的JSON(因为反斜杠没有正确转义),所以才会弹出parse error。
以后处理JSON和shell交互的时候,记住read -r和尽量让jq内部完成复杂操作这两个小技巧,能少踩好多转义的坑哦!




