【问题标题】:jq select object whose key value in the listjq 选择列表中键值的对象
【发布时间】:2021-11-28 16:18:43
【问题描述】:

我有一个脚本./getClasses.sh,它返回逗号分隔的列表,如ApexClass1,ApexClass2。此列表中有两个以上的项目。

我想使用jq 中的那个列表,通过某个键值过滤掉 JSON 值,该键值与列表中的一个值重合

我试过in运营商

echo $(cat tests.json) | jq '.result.coverage.coverage[] | select(.name included($(./getClasses.sh)))'  

includes 运算符

echo $(cat tests.json) | jq '.result.coverage.coverage[] | select(.name in($(./getClasses.sh)))' 

但他们都因错误而失败

jq: error: syntax error, unexpected IDENT, expecting ';' or ')' (Unix shell quoting issues?) at <top-level>, line 1:

文件 tests.json 包含以下 JSON

{"status": 0,
  "result": {
    "summary": {
      "outcome": "Passed",
      "testsRan": 13,
      "passing": 13,
      "failing": 0,
      "skipped": 0,
      "passRate": "100%",
      "failRate": "0%"}, "tests": [], "coverage": {
      "coverage": [
        {
          "name": "ApexClass1",
          "totalLines": 25,
          "lines": {},
          "totalCovered": 23,
          "coveredPercent": 92}, {
          "name": "ApexClass2",
          "totalLines": 25,
          "lines": {},
          "totalCovered": 23,
          "coveredPercent": 92}, {
          "name": "ApexClass3",
          "totalLines": 25,
          "lines": {},
          "totalCovered": 23,
          "coveredPercent": 92}
      ],
      "records": []
    } } }

我怎样才能达到想要的输出?

【问题讨论】:

  • 您的tests.json 无效。
  • 谢谢,错过了一个右括号,已修复

标签: json jq


【解决方案1】:

我想我明白了。

我需要将字符串作为参数传递,然后用逗号分隔并像这样取消括号:

classes=$(./getClasses.sh)
echo $(cat tests.json) | jq --arg classes $classes '.result.coverage.coverage[] | select(.name == ($classes | split(",")[])) | .totalLines' | awk '{s+=$1} END {print s}'

【讨论】:

    【解决方案2】:

    另一个选项使用inside() [docs] 来检查.name 是否存在于数组中。

    数组是使用:"ApexClass1,AapexClass2" | split(",") [docs]


    jq '[ .result.coverage.coverage[] | select([ .name ] | inside("ApexClass1,AapexClass2" | split(",") ) ) | . ]' tests.json
    
    [
      {
        "name": "ApexClass1",
        "totalLines": 25,
        "lines": {},
        "totalCovered": 23,
        "coveredPercent": 92
      },
      {
        "name": "ApexClass2",
        "totalLines": 25,
        "lines": {},
        "totalCovered": 23,
        "coveredPercent": 92
      }
    ]
    

    Online JqPlay Demo

    本地演示:

    ➜  find="ApexClass1,ApexClass3"
    ➜ 
    ➜  jq --arg find $find '[ .result.coverage.coverage[] | select([ .name ] | inside($find | split(",") ) ) | . ]' tests.json
    [
      {
        "name": "ApexClass1",
        "totalLines": 25,
        "lines": {},
        "totalCovered": 23,
        "coveredPercent": 92
      },
      {
        "name": "ApexClass3",
        "totalLines": 25,
        "lines": {},
        "totalCovered": 23,
        "coveredPercent": 92
      }
    ]
    ➜ 
    

    【讨论】:

    • 谢谢,我已经知道了
    • 是的,我知道,但我猜这个解决方案可能会更快一些。我想我还是会分享它;0
    • inside 比 '=' 快吗?如果有,请您解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2019-08-10
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多