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)
检查流中任何项目的条件是否为真
我的输入
{
"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)
检查流中任何项目的条件是否为真