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

如何让Apache Camel Split兼容3.12版本,返回非数组JSON对象?

恢复Apache Camel 3.13+版本中Split处理JSON对象的旧行为

在Camel 3.13版本后,Split组件对非数组/集合类型的JSON对象处理逻辑发生了变更:原本会将整个对象作为单个拆分项,现在会遍历对象的所有键值对,将每个键值对作为独立拆分项。要在新版本中保留3.12的行为,无需大规模重构,可通过以下几种方式实现:

方法一:将目标对象包装为集合传递给Split

修改内层Split的表达式,把thingA对象包装成一个单元素集合,让Split遍历集合时直接返回整个对象:

from("file://read/some/file.json")
    .convertBodyTo(String.class)
    .unmarshal().json()
    .split(simple("${body.get('listOfthings')}"))
      // 将thingA对象包装为单元素列表,强制Split按整个对象拆分
      .split(simple("[${body.get('thingA')}]"))
      .bean("processBodyBean");

这种方式完全兼容原有代码结构,仅修改内层Split的表达式即可,不会影响现有业务逻辑。

方法二:移除内层Split,直接传递对象

如果内层Split原本就只需要处理单个thingA对象,可直接去掉内层Split,通过表达式将对象传递给Bean:

from("file://read/some/file.json")
    .convertBodyTo(String.class)
    .unmarshal().json()
    .split(simple("${body.get('listOfthings')}"))
      .setBody(simple("${body.get('thingA')}"))
      .bean("processBodyBean");

这种方式更简洁,适合确认每个listOfthings元素中仅存在一个thingA对象的场景。

方法三:配置Split的迭代策略

通过split()方法的重载版本,指定使用单对象迭代器,强制将单个对象作为迭代源:

import org.apache.camel.util.Iterators;

from("file://read/some/file.json")
    .convertBodyTo(String.class)
    .unmarshal().json()
    .split(simple("${body.get('listOfthings')}"))
      .split(exchange -> Iterators.single(exchange.getIn().getBody(Map.class).get("thingA")))
      .bean("processBodyBean");

这种方式更灵活,适合需要自定义拆分逻辑的复杂场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:35:21