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

rlcwz9us  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(182)

我的Camel路由正在调用REST服务,该服务返回一个JSON字符串。问题是JSON不是一个对象,而是一个对象数组,即:

[
  { object_1 },
  { object_2 }
]

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

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

作为一个解决方案,我使用了表达式**.when(“${body} == '[]'”),它工作得很好,但是它不能给予我灵活性来找出 * 数组中有多少 * 元素(好吧,只是有0个或多于0个)。所以我真的喜欢.when(“${body expression} == 0”)
第二,我希望有一个表达式,它可以分配一个属性,例如,JSON数组中的第二个对象,来设置一个头属性。例如,
.header(“To”,expression)**。
有谁能帮我解释一下这些表达方式吗?

btxsgosb

btxsgosb1#

最好的方法是解组你的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

相关问题