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

为何使用WSO2 ESB遍历JSON文档无法提取对象字段值?

在WSO2 ESB中提取嵌套JSON字段的解决办法

嘿,我之前在WSO2 ESB项目里也碰到过类似的嵌套JSON字段提取问题,结合你的JSON结构,给你几个实用的方案:

1. 使用Property Mediator + JsonPath表达式

这是WSO2 ESB里最常用的提取方式,JsonPath可以直接定位到嵌套的字段。

比如要提取forecast_1下的country,或者morning里的min_temp,可以这样配置Property Mediator:

<property name="Country" expression="json-eval($.forecast_1.country)" scope="default" type="STRING"/>
<property name="MorningMinTemp" expression="json-eval($.forecast_1.morning.min_temp)" scope="default" type="INTEGER"/>
  • json-eval()是WSO2 ESB专门用于JSON路径解析的函数
  • 嵌套字段用**点号(.)**逐层访问,比如$.forecast_1.afternoon.status就能提取下午的天气状态

如果需要遍历多个类似forecast_1的对象(比如你的JSON后续可能有forecast_2、forecast_3),可以结合Foreach Mediator:

<foreach expression="json-eval($.*)" id="ForeachForecast">
    <sequence>
        <property name="CurrentCountry" expression="json-eval($.country)" scope="default" type="STRING"/>
        <!-- 这里可以添加后续处理逻辑,比如日志输出或者转发 -->
        <log level="custom">
            <property name="Extracted Country" expression="$ctx:CurrentCountry"/>
        </log>
    </sequence>
</foreach>

这里的json-eval($.*)会遍历根节点下的所有对象(比如forecast_1、forecast_2),在循环体内直接访问当前对象的字段即可。

2. 使用PayloadFactory Mediator重组/提取字段

如果你需要把多个提取的字段重新组合成新的JSON或XML结构,PayloadFactory是个好选择:

<payloadFactory media-type="json">
    <format>
        {
            "location": "$1, $2",
            "morning_weather": {
                "temp_range": "$3-$4",
                "status": "$5"
            }
        }
    </format>
    <args>
        <arg evaluator="json" expression="$.forecast_1.country"/>
        <arg evaluator="json" expression="$.forecast_1.province"/>
        <arg evaluator="json" expression="$.forecast_1.morning.min_temp"/>
        <arg evaluator="json" expression="$.forecast_1.morning.max_temp"/>
        <arg evaluator="json" expression="$.forecast_1.morning.status"/>
    </args>
</payloadFactory>

这个配置会生成一个简化的JSON结构,把你需要的字段整合进去。

3. 使用Script Mediator(JavaScript/Groovy)灵活处理

如果你的JSON结构复杂,或者需要更灵活的逻辑(比如判断空值),可以用Script Mediator写脚本处理:

JavaScript示例:

<script language="js"><![CDATA[
    // 获取当前Payload的JSON对象
    var payload = mc.getPayloadJSON();
    // 提取嵌套字段
    var district = payload.forecast_1.district;
    var afternoonHumidity = payload.forecast_1.afternoon.humidity || "N/A"; // 处理空值
    // 将提取的值设置到属性中,供后续 mediator 使用
    mc.setProperty("District", district);
    mc.setProperty("AfternoonHumidity", afternoonHumidity);
]]></script>

Groovy示例:

<script language="groovy"><![CDATA[
    def payload = new groovy.json.JsonSlurper().parseText(mc.getPayload())
    def forecast = payload.forecast_1
    mc.setProperty("ForecastDate", forecast.forecast_date)
    mc.setProperty("AfternoonStatus", forecast.afternoon.status)
]]></script>

注意事项

  • 确保你的Payload是JSON格式:如果传入的是XML,需要先用<convertPayload media-type="json"/>转换成JSON
  • 空字段处理:如果字段值为空(比如你的humidity),JsonPath会返回空字符串,脚本里可以用默认值替换(如上面JavaScript示例)
  • JsonPath语法验证:可以先用本地或在线工具验证你的路径是否正确,避免语法错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:54:26