如何用DataWeave实现POST请求的动态字段映射转换?
使用DataWeave实现占位符映射转换需求
问题描述
输入负载包含order数据对象与mapper映射规则对象,结构如下:
{ "order": { "Column_X": "X", "Column_Y": "Y", "Column_Z": "Z", "Column_W" : { "div_1": "some text", "div_2": true, "div_3": 2 } }, "mapper": { "A": "<order.Column_X>", "B": "<order.Column_Z>", "C": "Fields or text not mapped to order", "C1": "status", "D": { "D1": "<order.Column_W.div_1>", "D2": "<order.Column_W.div_2>", "D3": "<order.Column_W.div_3>", "D4": "<order.Column_W.div_4>" } } }
需要将mapper中的占位符(格式为<order.xxx>)替换为order对应路径的取值,若路径不存在则设为null,预期输出如下:
{ "A":"X", "B":"Z", "C":"Fields or text not mapped to order", "C1":"status", "D":{ "D1":"some text", "D2":true, "D3":2, "D4":null } }
DataWeave实现方案
通过递归遍历mapper结构,结合正则匹配占位符并动态取值的方式实现:
%dw 2.0 output application/json fun resolvePlaceholders(value: Any, orderData: Any): Any = value match { // 处理字符串类型,匹配占位符并替换 case s is String -> if (s matches /<order\.(.*)>/ ) { // 提取路径,从orderData中取值,不存在则返回null orderData dw::util::path(matches[1]) default null } else { s } // 处理对象类型,递归遍历每个键值对 case o is Object -> o mapObject ((v, k) -> (k): resolvePlaceholders(v, orderData) ) // 其他类型直接返回原值 case x -> x } --- resolvePlaceholders(payload.mapper, payload.order)
代码说明
- 递归函数
resolvePlaceholders:- 字符串类型:用正则
/<order\.(.*)>/匹配占位符,提取order内的路径,通过dw::util::path()工具函数取值,路径不存在时用default null返回null。 - 对象类型:遍历每个键值对,递归处理值,保留原对象结构。
- 布尔、数字等其他类型直接返回。
- 字符串类型:用正则
- 主逻辑:调用递归函数,传入
payload.mapper作为待处理规则,payload.order作为数据源。
内容的提问来源于stack exchange,提问作者Mio Figlio
相关产品推荐
相关产品推荐

