jq-根据属性的存在选择对象

时间:2019-08-08 03:04:24

标签: json jq

乍看之下,这听起来像是难以置信的直截了当,但我已经呆了几个小时了。

我试图提取参数对象的名称(未知),但前提是它列出了“ defaultValue”键。

输入对象(Azure ARM模板):

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "componentName": {
            "defaultValue": "storage",
            "type": "string"
        },
        "subnetId": {
            "type": "string",
            "metadata": {
                "description": "The subnet to which this storage component belongs."
            }
        }
    },
    "variables": {}
}

所需的输出:

    "componentName": {
        "defaultValue": "storage",
        "type": "string"
    }

我尝试了以下多次迭代,但均未成功:

.parameters[] | select(  has( "defaultValue")) 

(将对象扩展到其“ componentName”的名称之外,尽管可以正确找到两者的匹配对象)

.parameters | map(select(has("defaultValue"))) 

(与上述相同)

.parameters | select( any (has( "defaultValue"))) 

(这也会错误地返回SubnetId对象,该对象没有“ defaultValue”属性)

很明显,我误解了一些基本知识。我将不胜感激,可以提供任何建议或指示。

1 个答案:

答案 0 :(得分:2)

您所需的输出不是有效的JSON。我知道要获得的最接近的信息(无自定义字符串格式)是:

jq '.parameters | map_values(select(has("defaultValue")))'
# => {
#      "componentName": {
#        "defaultValue": "storage",
#        "type": "string"
#      }
#    }