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

在WSO2 ESB中基于双属性条件过滤JSON数据

WSO2 ESB下基于双属性条件过滤JSON数据的实现方案

嘿,我来帮你搞定WSO2 ESB里的汇率JSON数据过滤需求!针对你提供的包含汇率数组的JSON结构,我整理了两种实用的实现方案,你可以根据自己的条件复杂度来选:

方案一:Filter Mediator + JSONPath(适合简单双条件过滤)

这种方案用ESB原生的Filter中介器结合JSONPath表达式,配置简洁,适合规则明确的双属性判断场景。

实现步骤:

  1. 启用JSON消息处理:先确保你的Sequence/Proxy里设置了正确的消息类型,让ESB能解析JSON:
<property name="messageType" value="application/json" scope="axis2"/>
<property name="ContentType" value="application/json" scope="axis2"/>
  1. 定义过滤规则:假设你要过滤的条件是:basecurrency.currencyCode = 'USD' 且 updateddate > 1491180000000(你可以替换成自己的目标属性和值)。

  2. 编写过滤逻辑:用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' &amp;&amp; @.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' &amp;&amp; @.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里需要转义成&amp;&amp;
  • 如果你的属性是字符串类型,记得加单引号包裹值;数字类型直接写数值即可

方案二: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:45:39