简体   繁体   中英

jq flatten a deeply nested json document

Considering the following deeply nested json object

[
    {
        "level1key": "level1value",
        "children": [
            {
                "level2key": "level2value1",
                "children": [
                    {
                        "level3key1": "ignored",
                        "level3key2": "ignored",
                        "level3key3": [
                            {
                                "level4key": "ignored"
                            }
                        ]
                    },
                    {
                        "level3key1": "level3value1",
                        "level3key2": "level3value22",
                        "level3key3": [
                            {
                                "level4key": "level4value1"
                            }
                        ]
                    },
                    {
                        "level3key1": "level3value2",
                        "level3key2": "level3value22",
                        "level3key3": [
                            {
                                "level4key": "level4value2"
                            }
                        ]
                    }
                ]
            },
            {
                "level2key": "level2value2",
                "children": [
                    {
                        "level3key1": "ignored",
                        "level3key2": "ignored",
                        "level3key3": [
                            {
                                "level4key": "ignored"
                            }
                        ]
                    },
                    {
                        "level3key1": "level3value3",
                        "level3key2": "level3value22",
                        "level3key3": [
                            {
                                "level4key": "level4value3"
                            }
                        ]
                    },
                    {
                        "level3key1": "level3value4",
                        "level3key2": "level3value22",
                        "level3key3": [
                            {
                                "level4key": "level4value4"
                            }
                        ]
                    }
                ]
            }
        ]
    }
]

I need to filter by "level3value22" at .[0].children[].children[].level3key2 and flatten this deeply nested json object into an array. The expected result is the following. How should the jq sentence look like?

[
    {
        "v1": "level1value",
        "v2": "level2value1",
        "v3": "level3value1",
        "v4": "level4value1"
    },
    {
        "v1": "level1value",
        "v2": "level2value1",
        "v3": "level3value2",
        "v4": "level4value2"
    },
    {
        "v1": "level1value",
        "v2": "level2value2",
        "v3": "level3value3",
        "v4": "level4value3"
    },
    {
        "v1": "level1value",
        "v2": "level2value2",
        "v3": "level3value4",
        "v4": "level4value4"
    }
]

Thanks in advance!

I'm not sure if I understood correctly what you were trying to achieve but this at least works on your sample data:

[
  .[0] | [.level1key] + (
    .children[] | [.level2key] + (
      .children[] | select(.level3key2 == "level3value22") | [.level3key1] + (
        .level3key3[] | [.level4key]
      )
    )
  )
  | with_entries(.key |= "v\(. + 1)")
]
[
  {
    "v1": "level1value",
    "v2": "level2value1",
    "v3": "level3value1",
    "v4": "level4value1"
  },
  {
    "v1": "level1value",
    "v2": "level2value1",
    "v3": "level3value2",
    "v4": "level4value2"
  },
  {
    "v1": "level1value",
    "v2": "level2value2",
    "v3": "level3value3",
    "v4": "level4value3"
  },
  {
    "v1": "level1value",
    "v2": "level2value2",
    "v3": "level3value4",
    "v4": "level4value4"
  }
]

Demo

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM