如何使用WSO2 Enrich Mediator动态添加JSON元素?
解决JSON Payload添加orderSource元素的问题
嘿,我来帮你搞定这个问题!你现在的需求是给现有的JSON请求payload添加orderSource元素,而且已经把值捕获到属性里了,只是当前的处理流程有点小问题,咱们来调整一下~
你的代码问题分析
你当前的代码先把messageType设为application/xml,试图用XML的XPath来处理JSON结构,之后再转回JSON。这种XML-JSON来回转换的方式很容易导致结构错乱,而且没必要——咱们可以直接针对JSON结构操作,省去转换步骤。
修正方案(两种可选)
方案1:用PayloadFactory直接构建新JSON(推荐)
这种方式直接把原有JSON内容和orderSource元素合并,逻辑清晰,不容易出错:
<!-- 保留你已写好的属性捕获步骤 --> <property expression="get-property('orderSourceSF')" name="orderSource" scope="default" type="STRING"/> <!-- 保持messageType为JSON,不需要切换到XML --> <property name="messageType" scope="axis2" type="STRING" value="application/json"/> <!-- 用PayloadFactory合并原有request内容和新的orderSource元素 --> <payloadFactory media-type="json"> <!-- 这里的格式根据你原有JSON结构调整:如果orderSource是根节点下的元素,就用这个格式 --> <format>{"request": $1, "orderSource": "$2"}</format> <args> <!-- 用JSONPath提取原有request的全部内容 --> <arg evaluator="json" expression="$.request"/> <!-- 引用已捕获的orderSource属性值 --> <arg evaluator="xml" expression="get-property('orderSource')"/> </args> </payloadFactory>
如果你的需求是把orderSource加到request对象内部(比如原有request是{"request": {"name": "test"}},要变成{"request": {"name": "test", "orderSource": "xxx"}}),只需要调整payloadFactory的格式:
<payloadFactory media-type="json"> <format>{"request": {"name": "$1", "orderSource": "$2"}}</format> <args> <arg evaluator="json" expression="$.request.name"/> <arg evaluator="xml" expression="get-property('orderSource')"/> </args> </payloadFactory>
方案2:用Enrich直接给JSON节点添加元素
如果原有JSON结构比较复杂,不想逐个字段写,也可以用enrich结合JSONPath来插入元素:
<property expression="get-property('orderSourceSF')" name="orderSource" scope="default" type="STRING"/> <property name="messageType" scope="axis2" type="STRING" value="application/json"/> <!-- 将orderSource属性的值作为子元素添加到request对象中 --> <enrich> <source type="property" property="orderSource"/> <!-- 用json-eval()指定JSON路径,这里是给request对象加子元素 --> <target action="child" xpath="json-eval($.request)"/> </enrich>
关键注意点
- 始终保持
messageType为application/json,避免XML-JSON转换带来的结构问题; - 处理JSON时用JSONPath(比如
$.request),而不是XML的XPath; - 如果用
payloadFactory,字符串类型的属性值要加双引号(比如"$2"),确保生成的JSON格式合法。
内容的提问来源于stack exchange,提问作者Vilas
相关产品推荐
相关产品推荐

