如何使用WSO2 ESB ForEach中介遍历JSON文档所有一级对象
如何用WSO2 ESB的ForEach中介遍历JSON的所有一级对象
刚好我之前处理过类似的场景,给你一步步讲怎么实现:
首先,你的JSON结构里,一级对象是forecast_1这类节点,要遍历它们的核心是用JSONPath表达式定位根节点下的所有一级子对象,然后通过ForEach中介逐个处理。
具体配置示例
先确保你的ESB已经正确配置了JSON处理(一般默认是启用的,要是没开的话,去axis2.xml里启用JsonBuilder和JsonFormatter就行),然后可以写这样的中介序列:
<sequence name="ProcessForecastSeq" xmlns="http://ws.apache.org/ns/synapse"> <!-- ForEach遍历根节点下所有一级对象 --> <foreach expression="json-eval($.*)" id="forecastIterator"> <sequence> <!-- 输出当前遍历到的完整一级对象内容,方便调试 --> <log level="custom"> <property name="当前处理的Forecast节点" expression="json-eval($.)"/> </log> <!-- 如果需要获取一级节点的键名(比如forecast_1),可以这么做 --> <!-- 先获取根节点的所有一级键名数组 --> <property name="所有Forecast键名" expression="json-eval($keys($parent))" type="STRING"/> <!-- 获取当前遍历的索引(从0开始) --> <property name="当前索引" expression="get-property('forecastIterator', 'index')" type="INTEGER"/> <!-- 根据索引取出对应的键名 --> <property name="当前Forecast键名" expression="json-eval($get-property('所有Forecast键名')[$get-property('当前索引')])"/> <log level="custom"> <property name="当前Forecast键名" expression="get-property('当前Forecast键名')"/> </log> <!-- 这里可以加你的业务逻辑,比如解析morning、afternoon子节点,调用其他服务等 --> </sequence> </foreach> </sequence>
关键部分解释
json-eval($.*):这个JSONPath表达式会匹配根节点下的所有一级子对象,ForEach会按顺序逐个遍历这些节点。- 在ForEach内部的序列里,
json-eval($.)代表当前遍历到的那个一级对象(比如整个forecast_1的JSON内容)。 - 获取键名的逻辑:因为当前遍历的节点是根节点的子节点,所以通过
$parent拿到根节点,再用$keys($parent)获取所有一级键名的数组,结合ForEach的索引就能拿到当前节点对应的键名。
注意事项
- 确保你的ESB/EI版本支持
json-eval()函数(ESB 5.0+、EI 6.0+都支持)。 - 如果是REST API的负载,记得在API配置里设置
messageType="application/json",让ESB正确解析JSON。 - 调试的时候多利用Log中介输出内容,确认遍历的节点是否符合预期。
内容的提问来源于stack exchange,提问作者AndreaNobili
相关产品推荐
相关产品推荐

