使用DataWeave转换Salesforce JSON为指定格式,支持__c/__r字段动态映射
DataWeave JSON转换实现方案
输入数据
{"records" : { "a1e1X00000Ly5GfQAJ" : { "apiName" : "SP_Equipment__c", "childRelationships" : { }, "eTag" : "488cbd9fb3c67e20dbaac386ee2a49aa", "fields" : { "RecordType" : { "displayValue" : "Product", "value" : { "apiName" : "RecordType", "childRelationships" : { }, "eTag" : "69f1f78c0422f456b554c7e2f2f481c0", "fields" : { "Id" : { "displayValue" : null, "value" : "0121X0000036fjzQAA" }, "Name" : { "displayValue" : "Product", "value" : "Product" } }, "id" : "0121X0000036fjzQAA", "lastModifiedById" : "00509000002pidBAAQ", "lastModifiedDate" : "2021-10-29T08:29:32.000Z", "recordTypeId" : null, "recordTypeInfo" : null, "systemModstamp" : "2021-10-29T08:29:32.000Z", "weakEtag" : 1635496172000 } }, "RecordTypeId" : { "displayValue" : null, "value" : "0121X0000036fjzQAA" }, "SP_End_of_Commissioning__c" : { "displayValue" : null, "value" : null }, "SP_End_of_External_Warranty__c" : { "displayValue" : null, "value" : null }, "SP_Main_Product_Group__c" : { "displayValue" : null, "value" : "a1j1X000001opfqQAA" }, "SP_Main_Product_Group__r" : { "displayValue" : "Motors HV Loher Tube Cooled (Ex flameproof)", "value" : { "apiName" : "SP_Product_Group__c", "childRelationships" : { }, "eTag" : "3e30fe6b4f1ced0d9d31e9b188ea1ad9", "fields" : { "Id" : { "displayValue" : null, "value" : "a1j1X000001opfqQAA" }, "Name" : { "displayValue" : null, "value" : "Motors HV Loher Tube Cooled (Ex flameproof)" } }, "id" : "a1j1X000001opfqQAA", "lastModifiedById" : "0051X0000093craQAA", "lastModifiedDate" : "2021-10-07T08:10:14.000Z", "recordTypeId" : "012000000000000AAA", "recordTypeInfo" : null, "systemModstamp" : "2021-10-07T08:10:14.000Z", "weakEtag" : 1633594214000 } }, "SP_Number__c" : { "displayValue" : null, "value" : "10186735" }, "SP_Product_Number__c" : { "displayValue" : null, "value" : "1MV4567-6BJ60-4BD0-Z" }, "SP_Serial_Number__c" : { "displayValue" : null, "value" : "LDX/50000479" } }, "id" : "a1e1X00000Ly5GfQAJ", "lastModifiedById" : "0051X000008s3oDQAQ", "lastModifiedDate" : "2021-11-08T13:39:23.000Z", "recordTypeId" : "0121X0000036fjzQAA", "recordTypeInfo" : { "available" : true, "defaultRecordTypeMapping" : true, "master" : false, "name" : "Product", "recordTypeId" : "0121X0000036fjzQAA" }, "systemModstamp" : "2021-11-08T13:39:23.000Z", "weakEtag" : 1636378763000 } }}
转换规则
- 若存在
abcd__c字段,同时存在对应的abcd__r字段,则abcd__c的取值替换为abcd__r的内容,输出结果不保留所有__r后缀的字段 - RecordType的名称值映射到RecordTypeId字段,输出结果不保留独立的RecordType字段
示例规则说明:
示例输入
{ "abcd__c": "A001", "abcd__r": "A002" }示例输出
{ "abcd__c": "A002" }
期望输出结果
{ "RecordTypeId": "Product", "SP_End_of_Commissioning__c": null, "SP_End_of_External_Warranty__c": null, "SP_Main_Product_Group__c": "Motors HV Loher Tube Cooled (Ex flameproof)", "SP_Number__c": "10186735", "SP_Product_Number__c": "1MV4567-6BJ60-4BD0-Z", "SP_Serial_Number__c": "LDX/50000479" }
实现代码
%dw 2.0 output application/json // 动态获取records下的第一个业务对象的fields,无需写死ID var rawFields = payload.records.*[0].fields // 预处理所有字段,提取对应取值 var preProcess = rawFields mapObject (val, key) -> { (key): if (key endsWith "__r") val.displayValue else if (key == "RecordType") val.displayValue else if (key endsWith "__c" or key == "RecordTypeId") val.value else null } // 按规则生成最终结果 var finalResult = preProcess // 过滤掉不需要保留的字段 filterObject ((val, key) -> !(key endsWith "__r" or key == "RecordType")) // 替换映射字段的取值 mapObject (val, key) -> { (key): if (key endsWith "__c" and preProcess[(key[0 to -4] ++ "__r")]?) preProcess[(key[0 to -4] ++ "__r")] else if (key == "RecordTypeId") preProcess.RecordType else val } --- finalResult
内容的提问来源于stack exchange,提问作者SH4444KO
相关产品推荐
相关产品推荐

