首页 > 解决方案 > 在 Camel Route 中为 JSON 对象添加引号

问题描述

当我尝试将当前在键值对周围没有引号的 JSON 字符串解组为自定义 POJO 时,我遇到了问题。

我定义的骆驼路线是:

this.from("timer://foo?period=60000")
        .setBody(constant("select * from TEST_TABLE"))
        .to("jdbc:myJDBC")
        .marshal().json(JsonLibrary.Jackson)
        .split().jsonpath("$[*]").to("log:msg.inbound")
        .unmarshal().json(JsonLibrary.Jackson, Status.class)

从上面路径中的日志中,我收到我的 SQL 查询的行

Exchange[ExchangePattern: InOnly, BodyType: String, Body: {IS_IT_TIME=N, TIME_RECEIVED=1623816000000}]

我希望用引号返回行,以便我可以解组它们:

Exchange[ExchangePattern: InOnly, BodyType: String, Body: {"IS_IT_TIME"="N", "TIME_RECEIVED"=1623816000000}]

我环顾四周,发现有一个选项可以为 Jackson 读取未引用的 json,但我不想使用它,因为我没有直接与 ObjectMapper 交互。

如果有一种更简洁的方法可以将每一行作为 JSON 对象,我也会对此感兴趣。谢谢。

标签: javajsonapache-camel

解决方案


万一有人最终需要这个,我用下面的来得到我想要的结果:

this.from("timer://foo?period=60000")
            .setBody(constant(sqlQuery))
            .to("jdbc:myJDBC")
            .marshal().json(JsonLibrary.Jackson)
            .split().jsonpath("$[*]")
            .process(exchange -> {
                String newBody = new ObjectMapper()
                        .writeValueAsString(exchange.getIn().getBody());
                exchange.getIn().setBody(newBody);
            })
            .unmarshal().json(JsonLibrary.Jackson, Status.class)

在流程内部,我们可以使用 writeValueAsString 方法(由 ObjectMapper 的实例提供)处理消息的正文,然后将返回的正文设置为这个字符串。String newBody 由带引号的 JSON 对象组成。


推荐阅读