jq json 根据条件从内部数组中检索值并将其添加到数组外部

jq json retrieve value from an inner array based on condition and add it outside of array

我的输入

{
"data": {
    "assets": [{
        "aDASD": "1056bda9-2598-4fdf-bd99-db3924464a75",
        "KEY": "a7e2ef79-41aa-4a36-9ca1-1f388917eb12.ahnl",
        "key2": "store-order-picking-units-api",
        "key3": "1.0.1",
        "tags": [{
                "value": "abcd",
                "key": null,
                "mutable": false
            },
            {
                "value": "rest",
                "key": null,
                "mutable": false
            },
            {
                "value": "123",
                "key": null,
                "mutable": false
            }, {
                "value": "system",
                "key": null,
                "mutable": true
            },
            {
                "value": "market",
                "key": null,
                "mutable": true
            }
        ],
        "type": "mytype"
    }]
}

}

我想要如下输出

{
"data": {
    "assets": [{
        "aDASD": "1056bda9-2598-4fdf-bd99-db3924464a75",
        "KEY": "a7e2ef79-41aa-4a36-9ca1-1f388917eb12.ahnl",
        "key2": "store-order-picking-units-api",
        "key3": "1.0.1",
        "tags": [{
                "value": "abcd",
                "key": null,
                "mutable": false
            },
            {
                "value": "rest",
                "key": null,
                "mutable": false
            },
            {
                "value": "123",
                "key": null,
                "mutable": false
            }, {
                "value": "system",
                "key": null,
                "mutable": true
            },
            {
                "value": "market",
                "key": null,
                "mutable": true
            }
        ],
        "type": "mytype",
        "newkey1": "system",
        "newkey2": "market"
    }]
}

}

响应包含新密钥 1 和新密钥 2。现在棘手的部分来了。填充 newkey1 时,值可以是 "system" "process" 等,对于 newkey2,值可以是 "market"、"finance" 等。

换句话说,如果任何 .data.assets[].tags[].values 是系统或流程等,则应填充 newkey1...类似地,仅当市场、财务等时才填充 newkey2。

它是复杂的还是首先可以使用 jq 实现?请帮忙。

jq 是 Turing-complete,所以你很幸运:-)

您的要求并不完全清楚,但以下内容会产生您期望的输出,应该可以帮助您:

.data.assets |= map(
    .newkey1 = if any(.tags[].value; . == "system") then "system" else null end
  | .newkey2 = if any(.tags[].value; . == "market") then "market" else null end 
)

这里的重点是:

  • |=可用于更新;
  • any(stream; condition) 检查流中任何项目的条件是否为真