Problem Statement: We are faced with the task of processing an array of complex objects, where each object contains nested sub-objects. Our goal is to unravel this structure and create a new array that consists of individual elements from these nested structures. This transformation is necessary to simplify data processing and enable more efficient analysis and manipulation of the data.
Input.json
{
"link": [],
"record": 1,
"pageSize": 10,
"matchedEntities": [
{
"busEntity": {
"ContactView": {
"idObject": "6940205 ",
"ApplicationId": "CNT01",
"clnsdNm": "Jhon cena",
"certifiedContact": {
"id": "2",
"CertifiedContactDesc": "Uncertified"
},
"PtPostalAdd": {
"item": [
{
"id": "3149850 ",
"label": " Postal Address",
"mainAddrCd": {
"id": "3 ",
"label": "Lookup Postal Address Type",
"addrTypDesc": "Primary",
"addrTyp": "P"
},
"mdmOpsAddrInd": {
"rowidObject": "2",
"label": "Lookup Postal Address Type",
"addrTypDesc": "Not Appliacble",
"addrTyp": "N"
},
"PostalAddress_rowidObject": "3209850",
"PostalAddress": {
"rowidObject": "237",
"srcAddrln1": "BERNARDELLI",
"srcCity": "PORTO",
"srcState": "RJ",
"srcPstlCd": "5600re",
"srcCountryCd": {
"rowidObject": "32 ",
"label": "Lookup Source Country",
"cntryCd": "BR",
"cntryDesc": "Brazil"
},
"addrLn1": "2000 RUA FERNANDO BERNARDELLI",
"city": "PORTO REAL",
"state": "RJ",
"pstlCd": "27570000",
"countryCd": {
"cntryDesc": "Brazil",
"cntryCd": "BR"
}
}
},
{
"id": "43",
"label": " Postal Address 2",
"mainAddrCd": {
"id": "3 ",
"label": "Lookup Postal Address Type",
"addrTypDesc": "Primary",
"addrTyp": "P"
},
"mdmOpsAddrInd": {
"addrTypDesc": "Not Appliacble",
"addrTyp": "N"
},
"PostalAddress_id": "23",
"PostalAddress": {
"srcAddrln1": "test",
"srcCity": "test",
"srcState": "test",
"srcPstlCd": "5600re",
"srcCountryCd": {
"rowidObject": "32 ",
"label": "Lookup Source Country",
"cntryCd": "BR",
"cntryDesc": "Brazil"
},
"addrLn1": "2000 RUA FERNANDO BERNARDELLI",
"city": "PORTO REAL",
"state": "RJ",
"pstlCd": "27570000",
"countryCd": {
"cntryDesc": "Brazil",
"cntryCd": "BR"
}
}
}
]
}
}
},
"matchRule": "MRS Contact Search Match|1",
"matchScore": "100"
},
{
"busEntity": {
"ContactView": {
"id": "6940205 ",
"ApplicationId": "CNT02",
"clnsdNm": "Alexis Vieira",
"certifiedContact": {
"CertifiedContactDesc": "Uncertified"
},
"PtPostalAdd": {
"item": [
{
"id": "3149850 ",
"label": " Postal Address",
"mainAddrCd": {
"id": "3 ",
"label": "Lookup Postal Address Type",
"addrTypDesc": "Primary",
"addrTyp": "P"
},
"mdmOpsAddrInd": {
"addrTypDesc": "Not Appliacble",
"addrTyp": "N"
},
"PostalAddress_rowidObject": "3209850",
"PostalAddress": {
"srcAddrln1": "BERNARDELLI",
"srcCity": "PORTO",
"srcState": "RJ",
"srcPstlCd": "5600re",
"srcCountryCd": {
"rowidObject": "32 ",
"label": "Lookup Source Country",
"cntryCd": "BR",
"cntryDesc": "Brazil"
},
"addrLn1": "2000 RUA FERNANDO BERNARDELLI",
"city": "PORTO REAL",
"state": "RJ",
"pstlCd": "27570000",
"countryCd": {
"cntryDesc": "Brazil",
"cntryCd": "BR"
}
}
}
]
}
}
}
}
],
"facet": []
}
Actual output:
{
"partyContact" : {
"cntId" : [ "CNT01", "CNT02" ],
"cntName" : [ "Jhon cena", "Alexis Vieira" ],
"certifiedContact" : [ "Uncertified", "Uncertified" ]
},
"postalAddress" : [ {
"mainAddrCd" : [ "Primary", "Primary" ],
"addressType" : [ "Not Appliacble", "Not Appliacble" ],
"srcAddrLn1" : [ "BERNARDELLI", "BERNARDELLI" ],
"srcCity" : [ "PORTO", "PORTO" ],
"srcState" : [ "RJ", "RJ" ],
"srcPstlCd" : [ "5600re", "5600re" ],
"addressLine1" : [ "2000 RUA FERNANDO BERNARDELLI", "2000 RUA FERNANDO BERNARDELLI" ],
"city" : [ "PORTO REAL", "PORTO REAL" ],
"state" : [ "RJ", "RJ" ],
"postal_Code" : [ "27570000", "27570000" ],
"srcCountryCd" : [ "BR", "BR" ]
}, {
"mainAddrCd" : "Primary",
"addressType" : "Not Appliacble",
"srcAddrLn1" : "test",
"srcCity" : "test",
"srcState" : "test",
"srcPstlCd" : "5600re",
"addressLine1" : "2000 RUA FERNANDO BERNARDELLI",
"city" : "PORTO REAL",
"state" : "RJ",
"postal_Code" : "27570000",
"srcCountryCd" : "BR"
} ]
}
Jolt spec used
[
{
"operation": "shift",
"spec": {
"matchedEntities": {
"*": {
"busEntity": {
"ContactView": {
"ApplicationId": "partyContact.cntId",
"clnsdNm": "partyContact.cntName",
"certifiedContact": {
"CertifiedContactDesc": "partyContact.certifiedContact"
},
"PartyAlternateId": {
"item": {
"*": {
"altIdType": {
"idTyp": {
"0002": {
"@(3,altIdVal)": "partyContact.partyUid"
},
"0008": {
"@(3,altIdVal)": "partyContact.metalPortalUserId"
},
"0011": {
"@(3,altIdVal)": "partyContact.ecpPortalUserId"
}
}
}
}
}
},
"PtPostalAdd": {
"item": {
"*": {
"mainAddrCd": {
"addrTypDesc": "postalAddress[&2].mainAddrCd"
},
"mdmOpsAddrInd": {
"addrTypDesc": "postalAddress[&2].addressType"
},
"PostalAddress": {
"srcAddrln1": "postalAddress[&2].srcAddrLn1",
"srcAddrln2": "postalAddress[&2].srcAddrLn2",
"srcAddrln3": "postalAddress[&2].srcAddrLn3",
"SrcAddrln4": "postalAddress[&2].srcAddrLn4",
"srcCity": "postalAddress[&2].srcCity",
"srcState": "postalAddress[&2].srcState",
"srcPstlCd": "postalAddress[&2].srcPstlCd",
"srcSystem": "postalAddress[&2][&2].srcSystem",
"srcDoNotStd": "postalAddress[&2].srcDoNotStd",
"addrId": "postalAddress[&2].addressId",
"addrLn1": "postalAddress[&2].addressLine1",
"addrLn2": "postalAddress[&2].addressLine2",
"addrLn3": "postalAddress[&2].addressLine3",
"addrLn4": "postalAddress[&2].adddressLine4",
"city": "postalAddress[&2].city",
"county": "postalAddress[&2].county",
"state": "postalAddress[&2].state",
"pstlCd": "postalAddress[&2].postal_Code",
"countryCd": {
"cntryCd": "postalAddress[&3].srcCountryCd"
},
"vldtnStsCd": "postalAddress[&2].validation_Status_Code",
"enrchdInd": "postalAddress[&2].enrichedIndicator"
}
}
}
}
}
}
}
}
}
}
]
Expected output
[
{
"partyContact": {
"cntId": "CNT01",
"cntName": "Alexis Vieira",
"certifiedContact": "Uncertified",
"partyUid": "980",
"postalAddress": [
{
"mainAddrCd": "Primary",
"addressType": "Not Appliacble",
"srcAddrLn1": "test",
"srcCity": "test",
"srcState": "test",
"srcPstlCd": "5600re",
"addressLine1": "2000 RUA FERNANDO BERNARDELLI",
"city": "PORTO REAL",
"state": "RJ",
"postal_Code": "27570000",
"srcCountryCd": "BR"
},
{
"mainAddrCd": "Primary",
"addressType": "Not Appliacble",
"srcAddrLn1": "test",
"srcCity": "test",
"srcState": "test",
"srcPstlCd": "5600re",
"addressLine1": "2000 RUA FERNANDO BERNARDELLI",
"city": "PORTO REAL",
"state": "RJ",
"postal_Code": "27570000",
"srcCountryCd": "BR"
}
]
}
},
{
"partyContact": {
"cntId": "CNT02",
"cntName": "Alexis Vieira",
"certifiedContact": "Uncertified",
"partyUid": "980",
"postalAddress": [
{
"mainAddrCd": "Primary",
"addressType": "Not Appliacble",
"srcAddrLn1": "test",
"srcCity": "test",
"srcState": "test",
"srcPstlCd": "5600re",
"addressLine1": "2000 RUA FERNANDO BERNARDELLI",
"city": "PORTO REAL",
"state": "RJ",
"postal_Code": "27570000",
"srcCountryCd": "BR"
}
]
}
}
]
More identifiers to representate index nodes such as
[&3].partyContact
or [&4].partyContact
and
[&7].partyContact
or [&8].partyContact.
should be added as in the following case :
[
{
"operation": "shift",
"spec": {
"matchedEntities": {
"*": {
"busEntity": {
"ContactView": {
"ApplicationId": "[&3].partyContact.cntId",
"clnsdNm": "[&3].partyContact.cntName",
"certifiedContact": {
"CertifiedContactDesc": "[&4].partyContact.certifiedContact"
},
"PtPostalAdd": {
"item": {
"*": {
"mainAddrCd": {
"addrTypDesc": "[&7].partyContact.postalAddress[&2].mainAddrCd"
},
"mdmOpsAddrInd": {
"addrTypDesc": "[&7].partyContact.postalAddress[&2].addressType"
},
"PostalAddress": {
"srcAddrln1": "[&7].partyContact.postalAddress[&2].srcAddrLn1",
"srcAddrln2": "[&7].partyContact.postalAddress[&2].srcAddrLn2",
"srcAddrln3": "[&7].partyContact.postalAddress[&2].srcAddrLn3",
"SrcAddrln4": "[&7].partyContact.postalAddress[&2].srcAddrLn4",
"srcCity": "[&7].partyContact.postalAddress[&2].srcCity",
"srcState": "[&7].partyContact.postalAddress[&2].srcState",
"srcPstlCd": "[&7].partyContact.postalAddress[&2].srcPstlCd",
"srcSystem": "[&7].partyContact.postalAddress[&2][&2].srcSystem",
"srcDoNotStd": "[&7].partyContact.postalAddress[&2].srcDoNotStd",
"addrId": "[&7].partyContact.postalAddress[&2].addressId",
"addrLn1": "[&7].partyContact.postalAddress[&2].addressLine1",
"addrLn2": "[&7].partyContact.postalAddress[&2].addressLine2",
"addrLn3": "[&7].partyContact.postalAddress[&2].addressLine3",
"addrLn4": "[&7].partyContact.postalAddress[&2].adddressLine4",
"city": "[&7].partyContact.postalAddress[&2].city",
"county": "[&7].partyContact.postalAddress[&2].county",
"state": "[&7].partyContact.postalAddress[&2].state",
"pstlCd": "[&7].partyContact.postalAddress[&2].postal_Code",
"countryCd": {
"cntryCd": "[&8].partyContact.postalAddress[&3].srcCountryCd"
},
"vldtnStsCd": "[&7].partyContact.postalAddress[&2].validation_Status_Code",
"enrchdInd": "[&7].partyContact.postalAddress[&2].enrichedIndicator"
}
}
}
}
}
}
}
}
}
}
]
but note that there's no such node called "PartyAlternateId"
unlike to the currently stated one, so part is removed.