Используя Dataweave, как преобразовать входной Json в следующий вывод?

#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. Пожалуйста. Пожалуйста, не стесняйтесь принимать ответ, если он полезен.