Jolt grouping together and including new tags - specifications

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": {}
}
}
}
]

Related

Map Jolt Transformation

I am trying to transform the following input:
{
"test_types": {
"3": "Type3",
"21": "type21",
"16": "Type16",
"15": "type15"
},
"name": "BlackSquid",
"obj_name": "malware",
"value": "2341743",
"type": "16"
}
Into this output:
{
"test_types": {
"3": "Type3",
"21": "type21",
"16": "Type16",
"15": "type15"
},
"name": "BlackSquid",
"obj_name": "malware",
"value": "2341743",
"type": "16",
"type_name": "Type16"
}
I have tried to use a "modify-overwrite-beta" spec by hardcoding the key value which gives me the result I need:
[
{
"operation": "modify-overwrite-beta",
"spec": {
"type_name": "#(1,test_types.16)"
}
}
]
but I would like to use the "type" value dynamically. The following throws an exception but maybe something like this:
[
{
"operation": "modify-overwrite-beta",
"spec": {
"type_name": "#(1,test_types.#(1,type))"
}
}
]
No need to use modify-overwrite-beta spec, but condition based shift spec for the key type would suffice such as
[{
"operation": "shift",
"spec": {
"*": "&",
"type": {
"*": {
"#(2,type)": "type",
"#(2,test_types.&)": "type_name"
}
}
}
}]

Jolt : Add key in sub object

Input
{
"id": 1,
"name": "Sample name",
"attributes": {
"age": 10
}
}
Output
{
"id": 1,
"attributes": {
"name": "Sample name",
"age": 10
}
}
I want to carry out this transformation. I tried with the below spec
[
{
"operation": "shift",
"spec": {
"*": "&",
"name": "attributes.&"
}
}
]
But this changes attributes field into an array. What should be the right spec used here?
The following spec would work
[
{
"operation": "shift",
"spec": {
"*": "&",
"name": "attributes.&",
"attributes": {
"*": "attributes.&"
}
}
}
]

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].&"
}
}
}
}
}
]

Add array inside object with same key in jolt spec

I would like to move the recommendations array by row_id key inside the investors with the same row_id
Original Json
{
"investors": [
{
"row_id": 1,
"name": "AAAA"
},
{
"row_id": 2,
"name": "BBBB"
}
],
"recommendations": [
{
"row_id": "1",
"title": "ABC"
},
{
"row_id": "2",
"title": "CDE"
}
]
}
I've tried a lot of specs at https://jolt-demo.appspot.com with no success
Specs tried...
[{
"operation": "shift",
"spec": {
"investors": {
"*": "investors[]"
},
"recommendations": {
"#": "recommendations[]"
}
}
}]
Desired Json
{
"investors": [
{
"row_id": 1,
"name": "AAAA",
"recommendations":[{
"row_id": "1",
"title": "ABC"
}]
},
{
"row_id": 2,
"name": "BBBB",
"recommendations":[{
"row_id": "2",
"title": "CDE"
}]
}
]
}
This can be done in two stage shift
First shift groups everything based on row_id.
(I'd suggest running the first shift of its own to see what the output is)
Second shift uses that grouped output and formats results.
[
{
"operation": "shift",
"spec": {
"*": {
"*": {
"row_id": {
"*": {
"#2": "&.&4"
}
}
}
}
}
},
{
"operation": "shift",
"spec": {
"*": {
"investors": "investors.[#2]",
"recommendations": "investors.[#2].recommendations[]"
}
}
}
]