Skip to content

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