只变换JQ中对象的子数组



我正在尝试转换这个JSON对象:

{
"id_1": {},
"id_2": {
"sys": "S",
"details": [
{
"detail": "S1",
"index": 0
},
{
"detail": " ",
"index": 1
},
{
"detail": " ",
"index": 2
},
{
"detail": " ",
"index": 3
},
{
"detail": " ",
"index": 4
}
],
"color": "Grey"
},
"id_3": {
"sys": "A",
"details": [
{
"detail": "240",
"index": 0
},
{
"detail": "63",
"index": 1
},
{
"detail": "70",
"index": 2
},
{
"detail": " ",
"index": 3
},
{
"detail": " ",
"index": 4
}
],
"color": "White"
},
"id_4": {},
"id_5": {
"sys": "G",
"details": [
{
"detail": "266",
"index": 0
},
{
"detail": "G",
"index": 1
},
{ 
"detail": "1",
"index": 2
},
{
"detail": " ",
"index": 3
},
{
"detail": " ",
"index": 4
} 
],
"color": "Red"
}     
}

into that one:

{
"id_1": {},
"id_2": {
"sys": "S",
"details": ["S1"],
"color": "Grey",
},
"id_3": {
"sys": "A",
"details": ["240","63","70"],
"color": "White",
},
"id_4": {},
"id_5": {
"sys": "G",
"details": ["266", "G", "1"],
"color": "Red",
}
}

外层对象中也有应该保留的空对象。只有钥匙details需要转换,其他的都要保留。

无法创建mapselect的有效查询。到目前为止,我创建的唯一有效的jq:.[]? | [.details[]? | select(.detail != " ")] | .[] .detail,但只产生细节字符串…

有一种方法:

map_values(
select(has("details")) .details |=
map(.detail | select(. != " "))
)
<<p><一口>在线演示/一口>

您也可以使用values来清空没有.details字段的对象(或者将null作为其值的对象)。

.[].details |= (values | map(.detail | select(. != " ")))
{
"id_1": {},
"id_2": {
"sys": "S",
"details": ["S1"],
"color": "Grey"
},
"id_3": {
"sys": "A",
"details": ["240", "63", "70"],
"color": "White"
},
"id_4": {},
"id_5": {
"sys": "G",
"details": ["266", "G", "1"],
"color": "Red"
}
}

演示

试试这个:

jq 'map_values(.details? |= map(select(.detail != " "))' file.json

最新更新