Dealing with Nested Items¶
Filtering nested items¶
Recursively search a tree for values stored under a particular key.
jq¶
echo '{"data":{"value":10,"nested":{"value":20}}}' |
jq '[.. | .value? | select(. != null)]'
JFTL¶
TBD
Output¶
[ 10, 20 ]
Complete JFTL example¶
TBD
Filtering nested arrays¶
Collect nested array values and keep only those matching a condition.
jq¶
echo '{"data":[{"values":[1,2,3]},{"values":[4,5,6]}]}' |
jq '[.data[].values[] | select(. > 3)]'
JFTL¶
{
"$": true,
"foreach": {
"in": "$.data",
"out": { "$": true, "data": "$.values", "filter": "$py=_ > 3" }
},
"transform": "flatten"
}
Output¶
[ 4, 5, 6 ]
Complete JFTL example¶
{
"main": { "$": true, "data": "$_datasets.input", "out":
{
"$": true,
"foreach": {
"in": "$.data",
"out": { "$": true, "data": "$.values", "filter": "$py=_ > 3" }
},
"transform": "flatten"
}
},
"datasets": {
"input": {
"data": [
{
"values": [ 1, 2, 3 ]
},
{
"values": [ 4, 5, 6 ]
}
]
}
}
}
Flattening nested records¶
Flatten a nested object while preserving the path to every leaf value.
jq¶
echo '{"person":{"name":{"first":"Maya","last":"Cohen"},"age":34}}' |
jq '[paths(scalars) as $p | {path: ($p | join(".")), value: getpath($p)}]'
JFTL¶
TBD
Output¶
[
{ "path": "person.name.first", "value": "Maya" },
{ "path": "person.name.last", "value": "Cohen" },
{ "path": "person.age", "value": 34 }
]
Complete JFTL example¶
TBD
Mapping over nested items¶
Recursively find selected values and transform them.
jq¶
echo '{"data":{"value":10,"nested":{"value":20}}}' |
jq '[.. | .value? | select(. != null) | . * 5]'
JFTL¶
TBD
Output¶
[ 50, 100 ]
Complete JFTL example¶
TBD
Filtering and mapping over nested items¶
Walk an entire JSON tree and transform every number.
jq¶
echo '{"data":{"values":[1,2,3],"nested":{"values":[4,5,6]}}}' |
jq 'walk(if type == "number" then . * 2 else . end)'
JFTL¶
TBD
Output¶
{
"data": {
"values": [ 2, 4, 6 ],
"nested": {
"values": [ 8, 10, 12 ]
}
}
}
Complete JFTL example¶
TBD