I am trying to transform this JSON object:
{
"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",
}
}
There are also empty objects in the outer object that should be remained. Only the key details should be transformed, others should be kept.
Could not achive to create any valid query with map nor with select. The only valid jq I have created so far: .[]? | [.details[]? | select(.detail != " ")] | .[] .detail, but only results the details strings...
CodePudding user response:
Here is one way:
map_values(
select(has("details")) .details |=
map(.detail | select(. != " "))
)
CodePudding user response:
You can also use values to empty objects not having a .details field (or having one with null as its value).
.[].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"
}
}
CodePudding user response:
Try this :
jq 'map_values(.details? |= map(select(.detail != " "))' file.json
