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

WSO2 ESB中使用Script Mediator去除JSON数组重复元素问题咨询

问题根源

你现有配置的核心错误如下:

  • 语法违规:foreach mediator 不能嵌套在 payloadFactory 内部,这是网关更新序列失败的直接原因
  • 路径不匹配:foreach的JSONPath表达式和你实际返回的colors数组结构完全不符
  • 逻辑错误:在foreach循环内部定义去重数组,每次循环都会重置数组,最终仅能保留最后一个元素
  • 参数不匹配:payloadFactory的$2对应第二个入参,但你仅配置了1个arg,变量调用完全错位
  • JS逻辑混乱:代码中同时引用不存在的payload.results和payload[i],去重结果未存入属性就直接设置payload,后续节点无法读取

可用配置方案

直接使用Script Mediator处理完整数组即可,不需要额外配置foreach mediator,完整序列如下:

<sequence xmlns="http://ws.apache.org/ns/synapse" name="legalCost">
    <!-- 直接用JS脚本做数组去重 -->
    <script language="js"><![CDATA[
        // 读取原始payload
        var originalPayload = mc.getPayloadJSON();
        var colorArr = originalPayload.colors;
        // 数组去重
        var uniqueArr = [];
        for(var i=0; i<colorArr.length; i++){
            if(uniqueArr.indexOf(colorArr[i]) === -1){
                uniqueArr.push(colorArr[i]);
            }
        }
        // 把去重后的数组存入上下文属性
        mc.setProperty("uniqueColors", uniqueArr);
    ]]></script>

    <!-- 构造最终输出格式 -->
    <payloadFactory media-type="json">
        <format>
            {
                "colors": $1
            }
        </format>
        <args>
            <arg evaluator="json" expression="get-property('uniqueColors')"/>
        </args>
    </payloadFactory>

    <property name="messageType" value="application/json" scope="axis2"/>
</sequence>

说明

  • 如果你实际需要处理的是其他字段的数组,只需要修改JS里读取数组的字段名colors即可
  • 如果需要调整输出的根字段名,直接修改payloadFactory的format结构即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 17:45:06