如何访问 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
我的 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