Convert Multiple List Of Strings to different objects in Jolt - jolt

I have multiple list of strings in my request array. I have to iterate each list and take its first elements and form an object as bucketList similarly second elements of each list and form another object. How can be this achieved in jolt?
Request Packet:
{
"recordSet": [
{
"id": "123",
"bucketIdArray": [ "M03", "M02" ],
"bucketNameArray": [ "EmployeeBucket200", "EmployeeBucket100" ],
"bucketUsageArray": [ "500000000", "5000" ],
"postBucketValueArray": [ "5004000", "5000" ]
},
{
"id": "456",
"bucketIdArray": [ "M04" ],
"bucketNameArray": [ "EmployeeBucket300" ],
"bucketUsageArray": [ "500000000" ],
"postBucketValueArray": [ "5004000" ]
}
]
}
Response Expected:
{
"datas": {
"historyDetails": [
{
"historyId": "123",
"bucketlist": [
{
"bucketId": "M03",
"bucketName": "EmployeeBucket200",
"bucketUsage": "500000000",
"postBucketValue": "5004000"
},
{
"bucketId": "M02",
"bucketName": "EmployeeBucket300",
"bucketUsage": "50000",
"postBucketValue": "5004000"
}
]
},
{
"historyId": "456",
"bucketlist": [
{
"bucketId": "M04",
"bucketName": "EmployeeBucket300",
"bucketUsage": "500000000",
"postBucketValue": "5004000"
}
]
}
]
}
}

You can use this shift spec
[
{
"operation": "shift",
"spec": {
"*": {
"*": {
"id": "datas.historyDetails[&1].&",
"*": { "*": "datas.historyDetails[&2].bucketlist[&].&1" }
}
}
}
}
]
If the Array strings needed to be removed from the key names, then each key-value pair should explicitly be specified for them such as
[
{
"operation": "shift",
"spec": {
"*": {
"*": {
"*": "datas.historyDetails[&1].&",
"bucketIdArray": { "*": "datas.historyDetails[&2].bucketlist[&].bucketId" },
"bucketNameArray": { "*": "datas.historyDetails[&2].bucketlist[&].bucketName" },
"bucketUsageArray": { "*": "datas.historyDetails[&2].bucketlist[&].bucketUsage" },
"postBucketValueArray": { "*": "datas.historyDetails[&2].bucketlist[&].postBucketValue" }
}
}
}
}
]
Another option would be adding three more steps before our original shift spec in order to prevent hardcoding of each keys individually with Array suffix such as
[
{
"operation": "shift",
"spec": {
"*": {
"*": {
"*": {
"$": "&2.&.key",
"#": "&2.&.val"
}
}
}
}
},
{
"operation": "modify-overwrite-beta",
"spec": {
"*": {
"*": {
"key": "=split('Array',#(1,&))"
}
}
}
},
{
"operation": "shift",
"spec": {
"*": {
"*": {
"val": "&.[&2].#(1,key[0])"
}
}
}
},
{
"operation": "shift",
"spec": {
"*": {
"*": {
"id": "datas.historyDetails[&1].&",
"*": { "*": "datas.historyDetails[&2].bucketlist[&].&1" }
}
}
}
}
]

Related

JOLT Merging dissimilar elements

Here is my input
[{
"name": "LAST_UPDATE_DATE",
"value": 1075456461000
},
{
"name": "LAST_UPDATED_BY",
"value": {
"value": "BCw="
}
}]
Here is the expected output
[{
"name": "LAST_UPDATE_DATE",
"value": 1075456461000
},
{
"name": "LAST_UPDATED_BY",
"value": "BCw="
}]
Tried to add default fields so that I can compare further, but can't seem to create a node with a value already existing ( value: 1075456461000 )
[{
"operation": "modify-default-beta",
"spec": {
"*": {
"val" : null,
"value": {
"val" : null
}
}
}
}]
Any suggestions are appreciated.
After several hours of struggle here is what I came up with ....
[
{
"operation": "shift",
"spec": {
"*": {
"$": "&1.fieldname",
"#": "&1.val",
"value": "&1.value"
}
}
},
{
"operation": "remove",
"spec": {
"*": {
"*": {
"value": ""
}
}
}
},
{
"operation": "default",
"spec": {
"*": {
"value": null
}
}
},
{
"operation": "modify-default-beta",
"spec": {
"*": {
"value?": "#(1,val)"
}
}
},
{
"operation": "remove",
"spec": {
"*": {
"val": ""
}
}
}
]

Moving one array into json objects defined in another array - JOLT Transformation

I have my input defined as
{
"lineId": "1",
"Collection": {
"services": [
{
"Code": "TB",
"Type": [
"Data"
]
},
{
"Code": "MAGTB",
"Type": [
"Data"
]
}
]
},
"promotions": [
{
"Id": "1"
},
{
"Id": "2"
}
]
}
I would like to get my output as
{
"lineId": "1",
"Collection": {
"services": [
{
"Code": "TB",
"Type": [
"Data"
],
"promotions": [
{
"Id": "1"
},
{
"Id": "2"
}
]
},
{
"Code": "TB2",
"Type": [
"Data"
],
"promotions": [
{
"Id": "1"
},
{
"Id": "2"
}
]
}
]
}
}
Any help would be appreciated.
I am new to JOLT. And I'm having trouble navigating to the second array from inside the first.
Incomplete transformation that I tried:
[
{
"operation": "shift",
"spec": {
"Collection": {
"services": {
"*": "Collection.services[].&",
"#(3,lineId)": "lineId",
"#(3,promotions)":{
"*":
}
}
}
}
}
]
edit: Tried this now
[
{
"operation": "shift",
"spec": {
"Collection": {
"services": {
"*": "Collection.services[]",
// "*": "&",
"#(3,lineId)": "lineId",
"#(3,promotions)": {
"*": {
"Id": "Id"
}
}
}
}
}
}
]
I just have to figure out a way to move the Id list inside the objects in services array.
edit2:
[
{
"operation": "shift",
"spec": {
"Collection": {
"services": {
"*": {
"*": "Collection.services[&1].&",
"#(3,lineId)": "Collection.services[&1].lineId",
"#(3,promotions)": "Collection.services[&1].promotions"
}
}
}
}
}
]
I think this is the spec you're looking for?
[
{
"operation": "shift",
"spec": {
"lineId": "lineId",
"Collection": {
"services": {
"*": {
"#(3,promotions)": "Collection.services[&1].promotions",
"*": "Collection.services[&1].&"
}
}
}
}
}
]

Jolt giving values as root

Here's my input data :
[
{
"TEST1": "abcd",
"TEST2": "xyz",
"TEST3": "08"
},
{
"TEST1": "abcd",
"TEST2": "xyz",
"TEST3": "20"
}
]
Output
[
{
"TEST1": "root",
"TEST2": "xyz",
"TEST3": ["08","20"]
}
]
Expected Output
[
{
"TEST1": "abcd",
"TEST2": "xyz",
"TEST3": ["08","20"]
}
]
Jolt specs
[
{
"operation": "shift",
"spec": {
"": {
"TEST3": "#(1,TEST2).TEST3"
}
}
},
{
"operation": "shift",
"spec": {
"": {
"$1": "[#2].TEST1",
"$": "[#2].TEST2",
"#.TEST3": "[#2].TEST3"
}
}
}
]
Can you please help me in achieving the excpected output
Check this spec
[
//Concat the TEST1 and TEST2 to temp
{
"operation": "modify-default-beta",
"spec": {
"*": {
"temp": "=concat(#(1,TEST1),':',#(1,TEST2))"
}
}
},
//Group the values by shifting TEST3
{
"operation": "shift",
"spec": {
"*": {
"TEST3": "#(1,temp)"
}
}
},
// Assign the keys to the node named key and value to the node nameed value
{
"operation": "shift",
"spec": {
"*": {
"#": "[#2].key",
"$": "[#2].value"
}
}
},
//Shift and assign the respective values to the TEST1, TEST2 and TEST3
{
"operation": "shift",
"spec": {
"*": {
"value": {
"*:*": {
"$(0,1)": "[&3].TEST1",
"$(0,2)": "[&3].TEST2"
}
},
"key": "[&1].TEST3"
}
}
}
]

Jolt grouping together and including new tags

I have the following input JSON and want to group the sub jsons according to device name.(Device name has to be extracted from address). Also, i want to add new tags to the new arrays formed(Each array contains jsons having that type of device name only).
I've already tried below spec but the array Name name is appearing as deviceName instead of custom Parameter(I don't know how to provide custom name. for example i want the array name as "Parameters"). I'm not able to extract the device name from address field.(Device Name should come as "bee"/"honey"). Also, I want to add a new field which should be there once for the new array (and not for each element).
Input Json:
{
"CID": "AND",
"parameters": [{
"address": "abc:api:honey",
"name": "CH1"
},
{
"address": "abc:api:honey",
"name": "CH2"
},
{
"address": "abc:api:bee",
"name": "lat"
},
{
"address": "abc:api:bee",
"name": "long"
}
],
"rNo": 1232
}
Expected Output:
[{
"ID": "AND_1232",
"parameters": [{
"deviceName": "honey",
"name": "CH1",
"locoId": 1232,
"CID": "AND"
},
{
"deviceName": "honey",
"name": "CH2",
"locoId": 1232,
"CID": "AND"
}
],
"SpData": {
}
},
{
"ID": "AND_1232",
"parameters": [{
"deviceName": "bee",
"name": "lat",
"locoId": 1232,
"CID": "AND"
},
{
"deviceName": "bee",
"name": "long",
"locoId": 1232,
"CID": "AND"
}
],
"SpData": {
}
}]
Spec I tried:
[
{
"operation": "shift",
"spec": {
"parameters": {
"*": {
"#(2,CID)": "&2.[&1].CID",
"*": "&2.[&1].&",
"#(2,rNo)": "&2.[&1].locoId"
}
}
}
},
{
"operation": "modify-overwrite-beta",
"spec": {
"ID": "=concat(#(0,CID),'_',#(0,rNo))",
"parameters": {
"*": {
"deviceName": "=substring(#(1,address),8,11)",
"SpData": {}
}
}
}
}, {
"operation": "shift",
"spec": {
"parameters": {
"*": {
"deviceName": {
"*": {
"#2": "&[]"
}
}
}
}
}
}
]
The following will output desired results, each operation does the following respectively:
Add ID by concatenating CID and rNo
Add rNo and CID to all parameters and add deviceName (see here for details on device name splitting).
Group records by deviceName using object
Add ID to each group
Convert temporary grouping to array
Add default SpData
[
{
"operation": "modify-default-beta",
"spec": {
"ID": "=concat(#(1,CID),'_',#(1,rNo))"
}
},
{
"operation": "shift",
"spec": {
"ID": "&",
"parameters": {
"*": {
"address": {
"*:*:*": {
"$(0,3)": "parameters.[&3].deviceName"
}
},
"#(0,name)": "parameters.[&].name",
"#(2,rNo)": "parameters.[&].locoId",
"#(2,CID)": "parameters.[&].CID"
}
}
}
},
{
"operation": "shift",
"spec": {
"ID": "&",
"parameters": {
"*": {
"deviceName": {
"*": {
"#(3,[&2])": "tmp.&.parameters.[]"
}
}
}
}
}
},
{
"operation": "shift",
"spec": {
"tmp": {
"*": {
"#(2,ID)": "&1.ID",
"parameters": {
"#": "&2.parameters"
}
}
}
}
},
{
"operation": "shift",
"spec": {
"*": "[]"
}
},
{
"operation": "default",
"spec": {
"*": {
"SpData": {}
}
}
}
]

Set null if value is not exists, otherwise return existing value if exists in jolt

As shown in sample input, I have array of extension in each object. When extension doesn't consists subscription-type then output should be null as shown in output or else should consist existing value. Same should be applicable for language-type. Order of subscription-type and language-type is random in nature.
I have tried with spec but its not working
{
"operation": "modify-define-beta",
"spec": {
"*": {
"subscriptionType": {
"url": {
"myCoercedValue": "subscription-type",
"myStringValue": "subscription-type"
},
"value": {
"myCoercedValue": null,
"myStringValue": null
}
},
"languageType": {
"url": {
"myCoercedValue": "language-type",
"myStringValue": "language-type"
},
"value": {
"myCoercedValue": null,
"myStringValue": null
}
}
}
}
},
{
"operation": "shift",
"spec": {
"*": {
"extension": "[&1].extension",
"subscriptionType": "[&1].extension[]",
"languageType": "[&1].extension[]"
}
}
},
{
"operation": "shift",
"spec": {
"*": {
"extension": {
"*": {
"#url": {
"myStringValue": {
"subscription-type": {
"#(3,value.myStringValue)": "[&3].subscriptionType[]"
}
}
}
}
}
}
}
},
{
"operation": "shift",
"spec": {
"0": "[]"
}
}
]
Input:
[
{
"extension": []
},
{
"extension": [
{
"url": {
"myCoercedValue": "subscription-type",
"myStringValue": "subscription-type"
},
"value": {
"myCoercedValue": "free",
"myStringValue": "free"
},
"extension": []
}
]
},
{
"extension": [
{
"url": {
"myCoercedValue": "language-type",
"myStringValue": "language-type"
},
"value": {
"myCoercedValue": "en-us",
"myStringValue": "en-us"
}
},
{
"url": {
"myCoercedValue": "subscription-type",
"myStringValue": "subscription-type"
},
"value": {
"myCoercedValue": "free",
"myStringValue": "free"
}
}
]
}
]
Output:
[ {
"subscriptionType" : [ null, "free", "free" ],
"language":[null,null,"en-US"]
} ]
Perhaps you want to get such a result? Please, try those spec and say what you want to modify.
[
{
"operation": "shift",
"spec": {
"*": {
"extension": {
"*": {
"url": {
"myCoercedValue": {
"subscription-type": {
"#(3,value)": {
"myCoercedValue": "subscriptionType[#8]"
}
},
"language-type": {
"#(3,value)": {
"myCoercedValue": "language[#8]"
}
}
}
}
}
}
}
}
}
]