在WSO2 ESB中基于双属性条件过滤JSON数据
WSO2 ESB下基于双属性条件过滤JSON数据的实现方案
嘿,我来帮你搞定WSO2 ESB里的汇率JSON数据过滤需求!针对你提供的包含汇率数组的JSON结构,我整理了两种实用的实现方案,你可以根据自己的条件复杂度来选:
方案一:Filter Mediator + JSONPath(适合简单双条件过滤)
这种方案用ESB原生的Filter中介器结合JSONPath表达式,配置简洁,适合规则明确的双属性判断场景。
实现步骤:
- 启用JSON消息处理:先确保你的Sequence/Proxy里设置了正确的消息类型,让ESB能解析JSON:
<property name="messageType" value="application/json" scope="axis2"/> <property name="ContentType" value="application/json" scope="axis2"/>
定义过滤规则:假设你要过滤的条件是:
basecurrency.currencyCode = 'USD'且updateddate > 1491180000000(你可以替换成自己的目标属性和值)。编写过滤逻辑:用Filter中介器嵌套JSONPath判断,再通过PayloadFactory重组过滤后的JSON结构:
<!-- 先提取原JSON里的固定字段(_id、_rev)和汇率数组 --> <property name="_id" expression="json-eval($._id)" scope="default"/> <property name="_rev" expression="json-eval($._rev)" scope="default"/> <!-- 遍历汇率数组,过滤符合条件的条目 --> <filter xpath="json-eval($.exchangerate_data[?(@.basecurrency.currencyCode == 'USD' && @.updateddate > 1491180000000)])"> <then> <!-- 重组过滤后的JSON payload --> <payloadFactory media-type="json"> <format> { "_id": "$1", "_rev": "$2", "exchangerate_data": $3 } </format> <args> <arg evaluator="xml" expression="$ctx:_id"/> <arg evaluator="xml" expression="$ctx:_rev"/> <arg evaluator="json" expression="json-eval($.exchangerate_data[?(@.basecurrency.currencyCode == 'USD' && @.updateddate > 1491180000000)])"/> </args> </payloadFactory> </then> <else> <!-- 可选:处理没有符合条件的情况,比如返回空数组或提示信息 --> <payloadFactory media-type="json"> <format> { "_id": "$1", "_rev": "$2", "exchangerate_data": [], "message": "No matching exchange rate data found" } </format> <args> <arg evaluator="xml" expression="$ctx:_id"/> <arg evaluator="xml" expression="$ctx:_rev"/> </args> </payloadFactory> </else> </filter>
注意点:
- JSONPath里的逻辑与要用
&&,但在XML里需要转义成&& - 如果你的属性是字符串类型,记得加单引号包裹值;数字类型直接写数值即可
方案二:Script Mediator(JavaScript)(适合复杂条件过滤)
如果你的过滤逻辑涉及更复杂的判断(比如多值匹配、字符串模糊匹配等),用Script中介器写JavaScript代码会更灵活。
实现代码:
<property name="messageType" value="application/json" scope="axis2"/> <script language="js"> // 获取原始JSON payload var payload = mc.getPayloadJSON(); var filteredRates = []; // 遍历汇率数组,应用双条件过滤 if (payload.exchangerate_data && payload.exchangerate_data.length > 0) { for (var i = 0; i < payload.exchangerate_data.length; i++) { var rate = payload.exchangerate_data[i]; // 这里替换成你的双条件:比如basecurrency是USD,且更新时间大于指定值 if (rate.basecurrency.currencyCode === 'USD' && rate.updateddate > 1491180000000) { filteredRates.push(rate); } } } // 重组过滤后的JSON payload.exchangerate_data = filteredRates; // 如果需要,也可以添加无匹配时的提示 if (filteredRates.length === 0) { payload.message = "No matching exchange rate data found"; } // 将处理后的payload设置回消息上下文 mc.setPayloadJSON(payload); </script>
优势:
- 支持任意复杂的条件逻辑,比如正则匹配、数值计算后判断等
- 代码可读性高,便于后期维护和修改
测试小提示
你可以通过ESB的Tryit工具或者Postman发送请求,传入你提供的原始JSON数据,验证过滤结果是否符合预期。如果条件不匹配,记得检查属性名是否拼写正确、数据类型是否一致(比如日期戳是数字还是字符串)。
内容的提问来源于stack exchange,提问作者Estimate
相关产品推荐
相关产品推荐

