在WSO2配置语言中实现数据类型对象间的转换
解决WSO2中JSON输入到目标结构的转换问题
我懂你这种挫败感——用DataMapper和Enrich Mediator折腾半天,就是搞不定输入JSON到目标结构的转换对吧?其实这俩工具在处理这种简单字段映射+根节点重组的场景时,反而不如PayloadFactory或者Script Mediator来得直接。咱们直接上可行的方案:
方案1:用PayloadFactory Mediator(推荐,结构固定时首选)
PayloadFactory专门用来构建新的消息 payload,特别适合这种字段一一对应、结构明确的转换。你只需要把输入里的字段通过JSONPath引用到新的JSON结构里就行。
配置示例:
<payloadFactory media-type="json"> <format> { "BalanceEnquiryRequest": { "channel": null, "type": "$1", "customerId": "$2", "customerIdType": null, "submissionTime": null, "reqTranId": "$3", "passcode": null } } </format> <args> <arg evaluator="json" expression="$.requestMode"/> <arg evaluator="json" expression="$.agentAccountNumber"/> <arg evaluator="json" expression="$.requestID"/> </args> </payloadFactory>
解释:
<format>里是你要的目标JSON结构,用$1、$2这种占位符对应后面的参数<args>里通过JSONPath从输入payload里提取对应的值:$.requestMode对应目标里的type$.agentAccountNumber对应customerId$.requestID对应reqTranId
- 那些固定为
null的字段直接写死在format里就行
方案2:用Script Mediator(JavaScript,灵活场景适用)
如果之后需要加一些逻辑判断,用JavaScript脚本会更灵活。直接解析输入JSON,构建新的JSON对象再输出。
配置示例:
<script language="js"><![CDATA[ // 解析输入JSON var input = JSON.parse(mc.getPayloadJSON()); // 构建目标结构 var output = { "BalanceEnquiryRequest": { "channel": null, "type": input.requestMode, "customerId": input.agentAccountNumber, "customerIdType": null, "submissionTime": null, "reqTranId": input.requestID, "passcode": null } }; // 设置新的payload mc.setPayloadJSON(output); ]]></script>
解释:
- 先把输入payload转成JavaScript对象,直接通过属性访问提取值
- 按照目标结构创建新对象,把对应字段赋值进去
- 最后把新对象设置为当前消息的payload
为什么之前的工具没成功?
- DataMapper:可能是你在映射时没正确处理根节点的层级(输入是扁平结构,输出是嵌套的
BalanceEnquiryRequest根节点),或者字段映射时没选中正确的JSON路径,导致生成的payload结构不对。 - Enrich Mediator:Enrich更适合合并、替换部分payload,要实现这种全结构重组需要多次
clone+replace操作,步骤繁琐很容易出错,反而不如上面两种方法高效。
你可以把上面的任意一种配置加到你的序列(Sequence)里,放在接收输入之后的位置,就能得到你想要的输出了。
内容的提问来源于stack exchange,提问作者DaviesTobi alex
相关产品推荐
相关产品推荐

