【问题标题】:jq - looping through json object and only displaying certain valuesjq - 循环通过 json 对象并且只显示某些值
【发布时间】:2021-06-09 23:28:18
【问题描述】:

我目前正在学习如何使用jq。我有一个 json 对象,我可以使用jq 循环和读取值,例如cat test.json | jq -r '.test'。但是,当我只想显示具有outdateddeprecated = true 但如果relase = never-update-appnever-upgrade-app 从结果中省略时,我遇到了一些复杂性。我正在尝试cat test.json | jq '.test | select(.[].outdated==true)',但这并没有返回预期的结果。这是否可以通过 jq 实现并以以下所需格式显示?

我想要的输出如下所示:

Release Name                                             Installed    Latest    Old      Deprecated
test-app                                                 1.0.0        2.0.0     true     false  

json:

{
    "test": [{
        "release": "myapp1",
        "Installed": {
            "version": "0.3.0",
            "appVersion": "v1.2.6"
        },
        "Latest": {
            "version": "",
            "appVersion": ""
        },
        "outdated": false,
        "deprecated": false
    }, {
        "release": "myapp2",
        "Installed": {
            "version": "6.5.13",
            "appVersion": "1.9.1"
        },
        "Latest": {
            "version": "",
            "appVersion": ""
        },
        "outdated": false,
        "deprecated": false
    }, {
        "release": "test-app",
        "Installed": {
            "version": "1.0.0",
            "appVersion": ""
        },
        "Latest": {
            "version": "2.0.0",
            "appVersion": ""
        },
        "outdated": true,
        "deprecated": false
    }, {
        "release": "never-update-app",
        "Installed": {
            "version": "1.0.0",
            "appVersion": ""
        },
        "Latest": {
            "version": "3.0.0",
            "appVersion": ""
        },
        "outdated": true,
        "deprecated": false
    }, {
        "release": "never-upgrade-app",
        "Installed": {
            "version": "2.0.0",
            "appVersion": ""
        },
        "Latest": {
            "version": "2.0.0",
            "appVersion": ""
        },
        "outdated": false,
        "deprecated": true
    }]
}

【问题讨论】:

  • 输入无效,第51行缺少逗号
  • @BenjaminW。现在已经更正了。谢谢!
  • 可能重复:stackoverflow.com/questions/18592173/… 这里唯一不同的是您希望有多个条件,并且可能您希望格式化输出。格式是问题的一部分吗?
  • 这是一个解决多个条件的问题:stackoverflow.com/questions/33057420/…
  • @Weeble 谢谢你指点我。是的,格式化也是其中的一部分。我可以在我的帖子中解决这个问题

标签: json jq


【解决方案1】:

如何作用于数组中的每个元素

.test 中有一个数组。如果要提取该数组的各个元素以用于过滤器的其余部分,请使用.test[]。如果您想处理它们但将结果保存在数组中,请使用.test|map(...),其中... 是您要应用于数组元素的过滤器。

如何过滤多个条件的对象

in this question 所述,您可以将select() 过滤器与多个条件一起使用。所以,例如:

jq '.test[]|
    select(
        (.outdated or .deprecated) and
        .release != "never-update-app" and
        .release != "never-upgrade-app"
    )'

如何组合非平凡的过滤器

使用括号!例如,假设您想用startswith 测试替换两个“从不”测试。通过用括号将管道括​​起来,您可以隔离计算并获得真/假答案以组合成一个布尔表达式。

jq '.test[]|
    select(
        (.outdated or .deprecated) and
        (.release|startswith("never-")|not)
    )'

如何在表格中格式化结果

我认为formatting results in a table 上的这个答案可能就足够了。如果您有更具体的需求,我认为您可能希望将其拆分为一个单独的问题。

【讨论】:

  • 太棒了。如果.release 字段不同并且我想应用通配符或startswith。我可以做到这一点.release|startswith("never"),但我该如何申请或添加它以适应您的答案?
  • 啊,我急忙用布尔表达式弄错了。我已对其进行了更新并添加了进一步修改的示例。希望这足以让您朝着正确的方向前进。
猜你喜欢
  • 1970-01-01
  • 2016-10-11
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 2017-07-26
相关资源
最近更新 更多