You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)

代码说明

  1. 递归函数resolvePlaceholders:
    • 字符串类型:用正则/<order\.(.*)>/匹配占位符,提取order内的路径,通过dw::util::path()工具函数取值,路径不存在时用default null返回null。
    • 对象类型:遍历每个键值对,递归处理值,保留原对象结构。
    • 布尔、数字等其他类型直接返回。
  2. 主逻辑:调用递归函数,传入payload.mapper作为待处理规则,payload.order作为数据源。

内容的提问来源于stack exchange,提问作者Mio Figlio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:25:35