使用jq和quoted值处理json数组

时间:2015-08-20 18:22:56

标签: json linux bash jq

我正在尝试编写一个脚本,对json对象数组进行一些处理。源json的简化版本看起来像这样。请注意第二个对象中的转义双引号。

[
  {
    "id": "1a-2b",
    "name": "my job name",
    "description": "my job description"
  },
  {
    "id": "3c-4d",
    "name": "my \"quoted\" job name",
    "description": "my \"quoted\" job description"
  }
]

我的脚本目前尝试使用我在搜索中的其他位置找到的“while read”惯用法来迭代源代码。

while read job; do

  # fetch individual values into variables
  jobname=`echo $job | jq -r '.name'`

  # do processing on the individual values
  echo $jobname

done < <(cat jobs | jq -c '.[]')

问题似乎是转义的引号在紧凑的输出中转义为$ job变量。因此,当我在循环中使用jq重新处理单个对象时,我会在每个具有引用值的对象上获得jq解析错误。

我目前正在使用jq 1.4,而且我一直在尝试tojson / fromjson / @ sh / tostring的各种组合,但还没找到合适的组合。我不反对转移到jq 1.5,如果它有一个功能,将使这更容易。如果有更聪明的方法可以做我正在尝试的事情,我也没有与“同时阅读”成语结婚。

2 个答案:

答案 0 :(得分:4)

不是在每个数组元素上再次调用jq,而只需使用第一个为循环提供的调用来获取名称。

 while read -r job; do
     echo "$job"
 done < <(jq -c '.[].name' < jobs)

(并按照Etan的建议使用read -r

如果您需要多个变量,请尝试(例如)

while read -r id
      read -r job; do
    echo "$id: $job"
done < <(jq -c '.[]|.id,.name' < jobs)

答案 1 :(得分:1)

这可以在一行中完成

要查看,json文件内容(文件名是作业):
[ { "id": "1a-2b", "name": "my job name", "description": "my job description" }, { "id": "3c-4d", "name": "my \"quoted\" job name", "description": "my \"quoted\" job description" } ]

jq one liner jq '.[] | (.name)' jobs

输出:

"my job name" "my \"quoted\" job name"