Home > Enterprise >  JOLT shift transformation: collect all the items from all the levels without knowing how many levels
JOLT shift transformation: collect all the items from all the levels without knowing how many levels

Time:10-27

I am trying to transform a JSON using Jolt transformation looking for some input here. I am trying to get all the items from all the levels into an one array. My goal is to get an array that contains all the items without knowing how many levels I have in the json.

Here is my input and expected output:

Input:

{
  "id": 1,
  "item": [
    {
      "id": "1_1",
      "item": [
        {
          "id": "1_1_2",
          "foo": [
            {
              "nn": "cc",
              "vvv": "2022-08-30T06:44:24.943Z",
              "mmm": "oo"
            },
            {
              "nn": "ss",
              "vvv": "rr",
              "mmm": "oo"
            },
            {
              "nn": "ii",
              "vvv": "rr",
              "mmm": "oo"
            },
            {
              "nn": "uu",
              "vvv": "kk",
              "mmm": "oo"
            },
            {
              "nn": "pp",
              "vvv": "aaa",
              "mmm": "oo"
            },
            {
              "nn": "bb",
              "vvv": "tt",
              "mmm": "oo"
            },
            {
              "nn": "ff",
              "vvv": "tt",
              "mmm": "oo"
            },
            {
              "nn": "ff",
              "vvv": "tt",
              "mmm": "oo"
            },
            {
              "nn": "pp",
              "vvv": "yy",
              "mmm": "oo"
            }
          ]
        }
      ],
      "foo": [
        {
          "nn": "cc",
          "vvv": "ww",
          "mmm": "oo"
        },
        {
          "nn": "ss",
          "vvv": "rr",
          "mmm": "oo"
        },
        {
          "nn": "ii",
          "vvv": "rr",
          "mmm": "oo"
        },
        {
          "nn": "uu",
          "vvv": "kk",
          "mmm": "oo"
        },
        {
          "nn": "pp",
          "vvv": "aaa",
          "mmm": "oo"
        },
        {
          "nn": "bb",
          "vvv": "tt",
          "mmm": "oo"
        },
        {
          "nn": "d",
          "vvv": "tt",
          "mmm": "oo"
        },
        {
          "nn": "pp",
          "vvv": "yy",
          "mmm": "oo"
        }
      ]
    },
    {
      "id": "1_2",
      "item": [
        {
          "id": "1_2_1",
          "foo": [
            {
              "nn": "cc",
              "vvv": "ww",
              "mmm": "oo"
            },
            {
              "nn": "ss",
              "vvv": "rr",
              "mmm": "oo"
            },
            {
              "nn": "ii",
              "vvv": "rr",
              "mmm": "oo"
            },
            {
              "nn": "uu",
              "vvv": "kk",
              "mmm": "oo"
            },
            {
              "nn": "pp",
              "vvv": "aaa",
              "mmm": "oo"
            },
            {
              "nn": "bb",
              "vvv": "tt",
              "mmm": "oo"
            },
            {
              "nn": "bb_ee4d6bf4-1081-468a-b7b1-5445333dfab2",
              "vvv": "tt",
              "mmm": "oo"
            },
            {
              "nn": "pp",
              "vvv": "yy",
              "mmm": "oo"
            }
          ]
        }
      ],
      "foo": [
        {
          "nn": "cc",
          "vvv": "ww",
          "mmm": "oo"
        },
        {
          "nn": "ss",
          "vvv": "rr",
          "mmm": "oo"
        },
        {
          "nn": "ii",
          "vvv": "rr",
          "mmm": "oo"
        },
        {
          "nn": "uu",
          "vvv": "kk",
          "mmm": "oo"
        },
        {
          "nn": "pp",
          "vvv": "aaa",
          "mmm": "oo"
        },
        {
          "nn": "bb",
          "vvv": "tt",
          "mmm": "oo"
        },
        {
          "nn": "d",
          "vvv": "tt",
          "mmm": "oo"
        },
        {
          "nn": "pp",
          "vvv": "yy",
          "mmm": "oo"
        }
      ]
    }
  ]
}

Expected output:

[
  {
    "id": "1_1",
    "foo": [
      {
        "nn": "cc",
        "vvv": "ww",
        "mmm": "oo"
      },
      {
        "nn": "ss",
        "vvv": "rr",
        "mmm": "oo"
      },
      {
        "nn": "ii",
        "vvv": "rr",
        "mmm": "oo"
      },
      {
        "nn": "uu",
        "vvv": "kk",
        "mmm": "oo"
      },
      {
        "nn": "pp",
        "vvv": "aaa",
        "mmm": "oo"
      },
      {
        "nn": "bb",
        "vvv": "tt",
        "mmm": "oo"
      },
      {
        "nn": "d",
        "vvv": "tt",
        "mmm": "oo"
      },
      {
        "nn": "pp",
        "vvv": "yy",
        "mmm": "oo"
      }
    ]
  },
  {
    "id": "1_1_2",
    "foo": [
      {
        "nn": "cc",
        "vvv": "2022-08-30T06:44:24.943Z",
        "mmm": "oo"
      },
      {
        "nn": "ss",
        "vvv": "rr",
        "mmm": "oo"
      },
      {
        "nn": "ii",
        "vvv": "rr",
        "mmm": "oo"
      },
      {
        "nn": "uu",
        "vvv": "kk",
        "mmm": "oo"
      },
      {
        "nn": "pp",
        "vvv": "aaa",
        "mmm": "oo"
      },
      {
        "nn": "bb",
        "vvv": "tt",
        "mmm": "oo"
      },
      {
        "nn": "ff",
        "vvv": "tt",
        "mmm": "oo"
      },
      {
        "nn": "ff",
        "vvv": "tt",
        "mmm": "oo"
      },
      {
        "nn": "pp",
        "vvv": "yy",
        "mmm": "oo"
      }
    ]
  },
  {
    "id": "1_2",
    "foo": [
      {
        "nn": "cc",
        "vvv": "ww",
        "mmm": "oo"
      },
      {
        "nn": "ss",
        "vvv": "rr",
        "mmm": "oo"
      },
      {
        "nn": "ii",
        "vvv": "rr",
        "mmm": "oo"
      },
      {
        "nn": "uu",
        "vvv": "kk",
        "mmm": "oo"
      },
      {
        "nn": "pp",
        "vvv": "aaa",
        "mmm": "oo"
      },
      {
        "nn": "bb",
        "vvv": "tt",
        "mmm": "oo"
      },
      {
        "nn": "d",
        "vvv": "tt",
        "mmm": "oo"
      },
      {
        "nn": "pp",
        "vvv": "yy",
        "mmm": "oo"
      }
    ]
  },
  {
    "id": "1_2_1",
    "foo": [
      {
        "nn": "cc",
        "vvv": "ww",
        "mmm": "oo"
      },
      {
        "nn": "ss",
        "vvv": "rr",
        "mmm": "oo"
      },
      {
        "nn": "ii",
        "vvv": "rr",
        "mmm": "oo"
      },
      {
        "nn": "uu",
        "vvv": "kk",
        "mmm": "oo"
      },
      {
        "nn": "pp",
        "vvv": "aaa",
        "mmm": "oo"
      },
      {
        "nn": "bb",
        "vvv": "tt",
        "mmm": "oo"
      },
      {
        "nn": "bb_ee4d6bf4-1081-468a-b7b1-5445333dfab2",
        "vvv": "tt",
        "mmm": "oo"
      },
      {
        "nn": "pp",
        "vvv": "yy",
        "mmm": "oo"
      }
    ]
  }
]

My jolt spec:

[
  {
    "operation": "shift",
    "spec": {
      "item": {
        "*": {
          "*": "&",
          "item": {
            "*": {
              "*": "&",
              "item": {
                "*": {
                  "*": "&"
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "[#1].&1"
      }
    }
  }
]

Results:

[ {
  "id" : "1_1",
  "foo" : {
    "nn" : "cc",
    "vvv" : "2022-08-30T06:44:24.943Z",
    "mmm" : "oo"
  }
}, {
  "id" : "1_1_2",
  "foo" : {
    "nn" : "ss",
    "vvv" : "rr",
    "mmm" : "oo"
  }
}, {
  "id" : "1_2",
  "foo" : {
    "nn" : "ii",
    "vvv" : "rr",
    "mmm" : "oo"
  }
}, {
  "id" : "1_2_1",
  "foo" : {
    "nn" : "uu",
    "vvv" : "kk",
    "mmm" : "oo"
  }
}, {
  "foo" : {
    "nn" : "pp",
    "vvv" : "aaa",
    "mmm" : "oo"
  }
}, {
  "foo" : {
    "nn" : "bb",
    "vvv" : "tt",
    "mmm" : "oo"
  }
}, {
  "foo" : {
    "nn" : "ff",
    "vvv" : "tt",
    "mmm" : "oo"
  }
}, {
  "foo" : {
    "nn" : "ff",
    "vvv" : "tt",
    "mmm" : "oo"
  }
}, {
  "foo" : {
    "nn" : "pp",
    "vvv" : "yy",
    "mmm" : "oo"
  }
}, {
  "foo" : [ {
    "nn" : "cc",
    "vvv" : "ww",
    "mmm" : "oo"
  }, {
    "nn" : "ss",
    "vvv" : "rr",
    "mmm" : "oo"
  }, {
    "nn" : "ii",
    "vvv" : "rr",
    "mmm" : "oo"
  }, {
    "nn" : "uu",
    "vvv" : "kk",
    "mmm" : "oo"
  }, {
    "nn" : "pp",
    "vvv" : "aaa",
    "mmm" : "oo"
  }, {
    "nn" : "bb",
    "vvv" : "tt",
    "mmm" : "oo"
  }, {
    "nn" : "d",
    "vvv" : "tt",
    "mmm" : "oo"
  }, {
    "nn" : "pp",
    "vvv" : "yy",
    "mmm" : "oo"
  } ]
}, {
  "foo" : [ {
    "nn" : "cc",
    "vvv" : "ww",
    "mmm" : "oo"
  }, {
    "nn" : "ss",
    "vvv" : "rr",
    "mmm" : "oo"
  }, {
    "nn" : "ii",
    "vvv" : "rr",
    "mmm" : "oo"
  }, {
    "nn" : "uu",
    "vvv" : "kk",
    "mmm" : "oo"
  }, {
    "nn" : "pp",
    "vvv" : "aaa",
    "mmm" : "oo"
  }, {
    "nn" : "bb",
    "vvv" : "tt",
    "mmm" : "oo"
  }, {
    "nn" : "bb_ee4d6bf4-1081-468a-b7b1-5445333dfab2",
    "vvv" : "tt",
    "mmm" : "oo"
  }, {
    "nn" : "pp",
    "vvv" : "yy",
    "mmm" : "oo"
  } ]
}, {
  "foo" : [ {
    "nn" : "cc",
    "vvv" : "ww",
    "mmm" : "oo"
  }, {
    "nn" : "ss",
    "vvv" : "rr",
    "mmm" : "oo"
  }, {
    "nn" : "ii",
    "vvv" : "rr",
    "mmm" : "oo"
  }, {
    "nn" : "uu",
    "vvv" : "kk",
    "mmm" : "oo"
  }, {
    "nn" : "pp",
    "vvv" : "aaa",
    "mmm" : "oo"
  }, {
    "nn" : "bb",
    "vvv" : "tt",
    "mmm" : "oo"
  }, {
    "nn" : "d",
    "vvv" : "tt",
    "mmm" : "oo"
  }, {
    "nn" : "pp",
    "vvv" : "yy",
    "mmm" : "oo"
  } ]
} ]

only the 4 first items contains id and foo but not all their foo value only one

Only the 4 first items contains id and foo, but not all their foo value only one.

Can you please told me how to do it right?

CodePudding user response:

Apparently grouping by id values at each node needed such as

[
  {
    "operation": "shift",
    "spec": {
      "item": {
        "*": {
          "*": "@(1,id).&",
          "item": {
            "*": {
              "*": "@(1,id).&",
              "item": {
                "*": {
                  "*": "@(1,id).&"
                }
              }
            }
          }
        }
      }
    }
  },
  {
   // get rid of object labels
    "operation": "shift",
    "spec": {
      "*": ""
    }
  }
]
  • Related