#dataweave #mule4
Вопрос:
Ввод
{"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 } }}
Что я пробовал
%dw 2.0 output application/json import last from dw::core::Strings var values = payload.records.a1e1X00000Ly5GfQAJ.fields var keypair = values mapObject (item, index, mapper)-gt;{ "$(index)": if(("$(index)" last 3) == "__c") item.value else if("$(index)" == "recordType") item.value else item.displayValue } --- keypair
Выходной ток
{ "RecordType": "Product", "RecordTypeId": null, "SP_End_of_Commissioning__c": null, "SP_End_of_External_Warranty__c": null, "SP_Main_Product_Group__c": "a1j1X000001opfqQAA", "SP_Main_Product_Group__r": "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" }
Требуемая Производительность
{ "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" }
Это может быть динамичным, допустим, есть поле abcd__c, и оно имеет соответствующее поле abcd__r, и значение должно быть взято из abcd__r, чтобы сформировать выходные данные для этих случаев. Напр.:
Если ввод является
{ "abcd__c": "A001", "abcd__r": "A002" }
Выход
{ "abcd__c": "A002" }
Ответ №1:
Требование и пример неоднозначны, поэтому я сделал некоторые предположения, чтобы создать этот сценарий:
%dw 2.0 output application/json import last from dw::core::Strings fun replaceCwithR(s)=s replace /__c/ with("__r") var values = payload.records.a1e1X00000Ly5GfQAJ.fields fun convertRtoC(o) = o mapObject ((item, key, index) -gt; { "$(key as String)": if(("$(key as String)" last 3) == "__c") if (!isEmpty(values[replaceCwithR(key as String)])) log(values[replaceCwithR(key as String)].displayValue) else item.value else if("$(key as String)" == "RecordTypeId") values.RecordType.displayValue else item.displayValue } ) filterObject ((item, key, index)-gt; ((key as String) last 3) != "__r" and (key as String != "RecordType")) --- convertRtoC(values)
Выход (для предоставленного входа:
{ "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" }
Комментарии:
1. Я попробую это сделать и перезвоню тебе. Я думаю, это должно сработать. 🙂
2. { «Тип записи»: «Продукт», «SP_Конец__ввода в эксплуатацию__c»: null, «SP_Конец___Внешней_гарантии__c»: null, «SP_Основная_Группа продуктов__c»: «Двигатели с охлаждением с помощью трубки Loher (Ex огнестойкие)», «SP_Номер__c»: «10186735», «SP_Номер продукта__c»: «1MV4567-6BJ60-4BD0-Z», «SP_Серийный_Число__c»: «LDX/50000479» } Вывод, который мы получаем, просто отключен одним полем, вместо типа записи должен быть тип записи, как указано выше. Отдых-это работа! 🙂 Спасибо!
3. Я обновил ответ. Было бы полезно, если бы вы сначала объяснили правила преобразования.
4. да, чувак, мой плохой, большое тебе спасибо, тхо! Ты спасаешь мне жизнь 😀
5. Пожалуйста. Пожалуйста, не стесняйтесь принимать ответ, если он полезен.