You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jq从含空格的JSON对象提取值时遇解析错误,求最优解

问题:使用jq提取JSON中id和name字段时出现解析错误

给定如下JSON数据:

{
  "users": [
    {
      "id": "1",
      "name": "John Wick",
      "location": "USA"
    },
    {
      "id": "2",
      "name": "Walter White",
      "location": "USA"
    }
  ]
}

尝试用以下Bash脚本提取每个用户的id和name字段:

for key in $(jq -c '.users | .[]' sample.json); do
  id=$(jq -r '.id' <<< "$key");
  name=$(jq -r '.name' <<< "$key")
  echo $id $name
done

执行后出现解析错误:

parse error: Unfinished string at EOF at line 2, column 0

之前通过替换空格为特殊字符再还原的方法可行,但需要更优方案。


解决方案

问题根源在于for key in $(jq ...)的写法:当jq输出的紧凑JSON包含空格(比如"name": "John Wick"里的空格)时,Bash会将空格作为分隔符,把单个JSON对象拆分成多个片段,导致后续jq解析不完整的JSON字符串,从而触发报错。

方案1:用jq直接完成提取与格式化(最优)

无需借助Bash循环,让jq一次性提取并输出目标字段:

jq -r '.users[] | "\(.id) \(.name)"' sample.json

执行后直接得到结果:

1 John Wick
2 Walter White

方案2:正确用Bash循环处理JSON字符串

如果必须通过循环处理,改用while read读取jq的输出(jq -c会将每个JSON对象单独输出一行),避免单词分割:

jq -c '.users[]' sample.json | while read -r user; do
  id=$(jq -r '.id' <<< "$user")
  name=$(jq -r '.name' <<< "$user")
  echo "$id $name"
done

内容的提问来源于stack exchange,提问作者irfan basha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:45:29