如何访问 Camel 消息 body 中的数组元素

How to access array elements in body of Camel message

我的 Camel 路由正在调用 REST 服务,其中 returns 一个 JSON 字符串。问题是 JSON 不是 object 而是 object 的数组,即:

[
  { object_1 },
  { object_2 }
]

首先,我想弄清楚这个数组是否为空,作为 choice-when 语句中的表达式:

.choice()
  .when( <array-is-empty-expression> )
    ...
  .otherwise()
    ...

作为解决方案,我使用了表达式 .when("${body} == '[ ]'") 可以正常工作但不能让我灵活地找出数组中 有多少 个元素(好吧,只是有 0 个或多于 0 个)。所以我真的很喜欢 .when("${body expression} == 0").

其次,我想要一个表达式来分配 属性,例如 JSON 数组中的第二个 object,以设置 header 属性。例如,.header("To", expression).

谁能帮我解决这些表达式?

最好的方法是解组您的 Json 字符串以获取对象列表。然后您可以调用 size() 方法来获取列表中的元素数。最后,您可以使用 [] 运算符访问列表的任何元素:

        from("file://C:/q69164959/test")
        .unmarshal().json(JsonLibrary.Jackson)
        .setHeader("To", simple("Default"))
        .choice()
        .when(simple("${body.size()} == 0" ))
        .to("log:org.orzowei.so.question.q69164959?level=ERROR")
        .otherwise()
        .setHeader("To", simple("${body[0][a]}"))
        .to("log:org.orzowei.so.question.q69164959?level=WARN")
        .end()
        .log(LoggingLevel.INFO, "header.To == ${header.To}")

使用[]作为输入,你可以看到这个日志输出:

2021-09-13 23:41:49.830 ERROR 32028 --- [/q69076203/test] org.orzowei.so.question.q69164959        : Exchange[ExchangePattern: InOnly, BodyType: java.util.ArrayList, Body: ]
2021-09-13 23:41:49.830  INFO 32028 --- [/q69076203/test] route1                                   : header.To == Default

使用[{a=1, b=2}, {a=3, b=4}]作为输入,可以看到这样的日志输出:

2021-09-13 23:42:01.161  WARN 32028 --- [/q69076203/test] org.orzowei.so.question.q69164959        : Exchange[ExchangePattern: InOnly, BodyType: java.util.ArrayList, Body: [{a=1, b=2}, {a=3, b=4}]]
2021-09-13 23:42:01.161  INFO 32028 --- [/q69076203/test] route1                                   : header.To == 1