使用Jolt将含嵌套元素的对象数组转换为独立对象列表
Jolt转换:构建包含关联地址的联系人对象数组
问题描述
我们需要处理包含嵌套子对象的复杂对象数组,目标是拆解该结构,生成由嵌套结构中独立元素组成的新数组,以简化数据处理、提升数据分析与操作效率。当前使用给定的Jolt规则转换后,实际输出不符合预期,需调整规则,使输出为每个partyContact包含自身关联的postalAddress数组的对象列表。
输入数据(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": [] }
当前实际输出
{ "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规则
[ { "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" } } } } } } } } } } ]
预期输出
[ { "partyContact": { "cntId": "CNT01", "cntName": "Jhon cena", "certifiedContact": "Uncertified", "postalAddress": [ { "mainAddrCd": "Primary", "addressType": "Not Appliacble", "srcAddrLn1": "BERNARDELLI", "srcCity": "PORTO", "srcState": "RJ", "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", "postalAddress": [ { "mainAddrCd": "Primary", "addressType": "Not Appliacble", "srcAddrLn1": "BERNARDELLI", "srcCity": "PORTO", "srcState": "RJ", "srcPstlCd": "5600re", "addressLine1": "2000 RUA FERNANDO BERNARDELLI", "city": "PORTO REAL", "state": "RJ", "postal_Code": "27570000", "srcCountryCd": "BR" } ] } } ]
(注:修正了原预期输出中CNT01联系人姓名的错误,应为Jhon cena)
调整后的Jolt规则
[ { "operation": "shift", "spec": { "matchedEntities": { "*": { "busEntity": { "ContactView": { "ApplicationId": "[&1].partyContact.cntId", "clnsdNm": "[&1].partyContact.cntName", "certifiedContact": { "CertifiedContactDesc": "[&2].partyContact.certifiedContact" }, "PtPostalAdd": { "item": { "*": { "mainAddrCd": { "addrTypDesc": "[&4].partyContact.postalAddress[&1].mainAddrCd" }, "mdmOpsAddrInd": { "addrTypDesc": "[&4].partyContact.postalAddress[&1].addressType" }, "PostalAddress": { "srcAddrln1": "[&4].partyContact.postalAddress[&1].srcAddrLn1", "srcCity": "[&4].partyContact.postalAddress[&1].srcCity", "srcState": "[&4].partyContact.postalAddress[&1].srcState", "srcPstlCd": "[&4].partyContact.postalAddress[&1].srcPstlCd", "addrLn1": "[&4].partyContact.postalAddress[&1].addressLine1", "city": "[&4].partyContact.postalAddress[&1].city", "state": "[&4].partyContact.postalAddress[&1].state", "pstlCd": "[&4].partyContact.postalAddress[&1].postal_Code", "srcCountryCd": { "cntryCd": "[&5].partyContact.postalAddress[&2].srcCountryCd" }, "countryCd": { "cntryCd": "[&5].partyContact.postalAddress[&2].srcCountryCd" } } } } } } } } } } } ]
关键修改说明
- 根节点映射:使用
[&1]对应matchedEntities数组的每个元素索引,将每个联系人转换为输出数组的一个独立对象。 - 联系人字段映射:将
ApplicationId、clnsdNm等字段映射到[&1].partyContact下,确保每个联系人的属性独立存在,不会合并为数组。 - 地址关联映射:将地址字段映射到
[&4].partyContact.postalAddress[&1],其中&4对应外层matchedEntities的索引,&1对应当前PtPostalAdd.item的索引,实现每个联系人的地址数组与自身关联。
内容的提问来源于stack exchange,提问作者Rakesh GR
相关产品推荐
相关产品推荐

