while循环移除引号转义致jq解析JSON失败的技术求助
问题与解决方法
问题场景
变量$response存储合法JSON数据(其中definition字段内的引号已正确转义,例如(with \\"the\\")),但执行以下脚本时,jq抛出JSON解析错误:
执行的脚本
echo "$response" | jq -c '.[].meanings[]' | while read meaning; do echo "$meaning" echo "$meaning" | jq -r '.' exit done
错误结果
输出的JSON中转义引号丢失(变为(with "the")),导致jq报错:
{..."definition":"(with "the")"...} jq: parse error: Invalid literal at line 1, column 64
问题原因
read命令默认会解析反斜杠转义字符,把JSON里的\\"转换成",破坏了JSON的语法结构,导致后续jq无法解析。
解决方案
方案1:直接用jq处理(推荐)
jq本身支持遍历操作,无需借助shell循环,直接用jq一次性处理所有meanings对象,既高效又不会破坏转义:
# 紧凑格式输出 echo "$response" | jq -c '.[].meanings[]' # 格式化易读输出 echo "$response" | jq '.[].meanings[]'
方案2:修改read命令行为(保留循环场景)
如果必须使用shell循环,给read添加-r参数(禁止解析转义字符),确保JSON转义被完整保留:
echo "$response" | jq -c '.[].meanings[]' | while read -r meaning; do echo "$meaning" | jq -r '.' done
内容的提问来源于stack exchange,提问作者sloppy
相关产品推荐
相关产品推荐

