用jq和引用值处理json数组

我试图编写一个脚本,对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" } ] 

我的脚本目前尝试使用在我的search中find的“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 '.[]') 

问题似乎是,转义引号在紧凑输出中被取消,随后是$ jobvariables。 所以当我在循环中用jq重新处理单独的对象时,我得到每个引用了值的对象的jqparsing错误。

我目前正在使用jq 1.4,我一直在尝试tojson / fromjson / @ sh / tostring的各种组合,但还没有find合适的组合。 我不反对如果它有一个function,将使这更容易jq 1.5。 如果有一个更聪明的办法来做我想做的事情,我也不会结婚的“读”成语。

Solutions Collecting From Web of "用jq和引用值处理json数组"

而不是在每个数组元素上再次调用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) 

这可以在一行中完成

回顾一下,json文件的内容(文件名是jobs):
[ { "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 jq '.[] | (.name)' jobs

而输出:

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