如何用DataWeave 2.0基于两个输入Payload构建目标JSON Payload
问题
现有两个输入Payload:
- Payload #1:员工动态字段数据(示例含2个字段)
- Payload #2:所有字段的元数据信息
需使用DataWeave 2.0构建Payload #3,将Payload #1的每个字段值与Payload #2中对应元数据结合,生成包含employeeParamValue及完整元数据的parameters数组。
Payload #1 示例
{ "employee": [ { "Employee_Number": "123456", "Country_of_Birth": "USA" } ] }
Payload #2 示例
[ { "employeeMetaColumn": "Employee_Number", "employeeMetaText": "Employee Number", "employeeMetaType": "SECT", "employeeMetaId": 435 }, { "employeeMetaColumn": "Country_of_Birth", "employeeMetaText": "Country of Birth", "employeeMetaType": "SECT", "employeeMetaId": 345 }, { "employeeMetaColumn": "Years_Completed", "employeeMetaText": "Years Completed", "employeeMetaType": "FLD", "employeeMetaId": 427 }, { "employeeMetaColumn": "First_Name", "employeeMetaText": "First Name", "employeeMetaType": "SECT", "employeeMetaId": 998 } ]
目标Payload #3 示例
{ "parameters": [{ "employeeParamValue": ["123456"], "employeeMetaColumn": "Employee_Number", "employeeMetaText": "Employee Number", "employeeMetaType": "SECT", "employeeMetaId": 435 }, { "employeeParamValue": ["USA"], "employeeMetaColumn": "Country_of_Birth", "employeeMetaText": "Country of Birth", "employeeMetaType": "SECT", "employeeMetaId": 345 } ] }
解决方案
以下是实现需求的DataWeave 2.0代码:
%dw 2.0 output application/json // 将元数据数组转换为以字段名为键的对象,方便快速查找 var metaLookup = payload2 reduce ((item, acc = {}) -> acc ++ {(item.employeeMetaColumn): item}) // 获取员工数据(示例中employee数组仅含一个对象,取第一个元素) var employeeData = payload1.employee[0] --- { parameters: employeeData pluck ((value, key) -> // 匹配对应元数据,添加employeeParamValue字段 metaLookup[key] ++ { employeeParamValue: [value] } ) }
代码说明
- metaLookup变量:通过
reduce将Payload #2的元数据数组转换为键值对对象,键为employeeMetaColumn的值,值为对应的元数据对象,这样可以快速通过字段名查找元数据,避免多次遍历数组。 - employeeData变量:提取Payload #1中
employee数组的第一个元素(示例中仅一个员工数据)。 - 生成parameters数组:使用
pluck遍历员工数据的每个键值对,找到对应的元数据后,合并元数据对象与employeeParamValue字段(将字段值包装为数组),最终组成parameters数组。
内容的提问来源于stack exchange,提问作者Sunny85
相关产品推荐
相关产品推荐

