Issue
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.
Can you please told me how to do it right?
Solution
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": {
"*": ""
}
}
]
Answered By - Barbaros Özhan
Answer Checked By - Cary Denson (JavaFixing Admin)