【问题标题】:Processing json array with jq and quoted values处理带有 jq 和引用值的 json 数组
【发布时间】:2015-08-20 18:22:55
【问题描述】:

我正在尝试编写一个对 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 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,如果它具有使这更容易的功能。如果有更聪明的方法来做我想做的事情,我也不会接受“阅读时”的成语。

【问题讨论】:

  • 这不太对 while/read 成语。见Bash FAQ 001。具体尝试while IFS= read -r; doecho "$job" | ... 看看是否有帮助。 jq 可能正在做正确的事情。你的 shell sn-p 把这一切都吹到你身上了。例如,仅尝试 jq 命令。此外,如果jq 直接采用文件名,那么&lt;(jq -c '.[]' jobs) 会稍微好一些。
  • Bash 常见问题解答链接似乎没有得到正确处理。但是在读取中添加“-r”肯定可以解决问题。如果您想将您的评论进一步扩展为答案,我很乐意将其标记为解决方案。
  • 链接现在有效。不过,我在编辑之前搞砸了。

标签: json linux bash jq


【解决方案1】:

无需对每个数组元素再次调用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)

【讨论】:

  • 如果我需要的唯一值是名称,我肯定会这样做。但是我需要获取对象中的任意数量的字段并对其采取行动。
  • 哦,我喜欢多重读取选项,而不是在循环内再次调用 jq。 '-r' 本身就可以解决原来的问题,但这更优雅。
【解决方案2】:

这可以在一行中完成

查看,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 一班轮jq '.[] | (.name)' jobs

还有输出:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多