Home > other >  jq ~ collapse specific single object arrays?
jq ~ collapse specific single object arrays?

Time:11-23

corresponding to jq ~ is there a better way to collapse single object arrays? and R: Nested data.table to JSON how do I collapse only specific elements?

I want to get rid of the "group" arrays in

[
  {
    "id2": "A",
    "group": [
      {
        "data": [
          {
            "id1": 1,
            "group": [
              {
                "data": [
                  {
                    "a": 1,
                    "b": 1
                  },
                  {
                    "a": 2,
                    "b": 2
                  }
                ],
                "type": "test"
              }
            ],
            "type": "B"
          }
        ],
        "type": "C"
      }
    ]
  },
  {
    "id2": "C",
    "group": [
      {
        "data": [
          {
            "id1": 3,
            "group": [
              {
                "data": [
                  {
                    "a": 1,
                    "b": 1
                  }
                ],
                "type": "test"
              }
            ],
            "type": "B"
          }
        ],
        "type": "C"
      }
    ]
  }
]

desired output

[{
        "id2": "A",
        "group": {
            "data": [{
                "id1": 1,
                "group": {
                    "data": [{
                            "a": 1,
                            "b": 1
                        },
                        {
                            "a": 2,
                            "b": 2
                        }
                    ],
                    "type": "test"
                },
                "type": "B"
            }],
            "type": "C"
        }
    },
    {
        "id2": "C",
        "group": {
            "data": [{
                "id1": 3,
                "group": {
                    "data": [{
                        "a": 1,
                        "b": 1
                    }],
                    "type": "test"
                },
                "type": "B"
            }],
            "type": "C"
        }
    }
]

The line 'walk(if type=="array" and length==1 then .[0] else . end)' additionally removes the array from the single "data" object.

CodePudding user response:

We could operate one level higher in the nesting hierarchy, and test for "group" being a key, then update accordingly .group = .group[0] instead of . = .[0]

jq 'walk(if type=="object"
          and has("group") 
          and (.group | type)=="array" 
          and (.group | length)==1 
          then .group = .group[0] 
          else . end)'
  • Related