我如何遍历Camel体内的嵌套列表?

时间:2019-01-15 05:03:29

标签: java json apache-camel spring-dsl

我正在尝试访问传入Json的传入{body}中的数据,我已经与Jackson进行了编组,并使用

将其映射到Java Map类。
  `.unmarshal().json(JsonLibrary.Jackson, java.util.Map.class)
`

经过上面的解组步骤之后,我传入的Json数据就是这样

{ "projectId" : 12345,
"title" : “12345 - Plant 1 Processing",
"partners": [{"partnerName": "partnerJV1", "partnerLocation": "JA"},
{"partnerName": "partnerJV2", "partnerLocation": "FL"},
{"partnerName": "partnerJV3", "partnerLocation": "OH"}
]

合作伙伴字段可以包含0-N个partnerName,partnerLocation映射。

现在我要使用

将其插入到SQL表中
.to("sql:classpath:sql/sql_queries.sql")

我的sql_queries.sql中包含以下查询,用于将数据字段插入表中:

INSERT INTO MY_TABLE(PID, TITLE, PartnerName1, PartnerLocation1, PartnerName2, PartnerLocation2, PartnerName3, PartnerLocation3) VALUES(:#${body['projectId']}, :#${body['title']}, :#${body['partners[0]']['partnerName']}, :#${body['partners[0]']['partnerLocation']} )

我的问题是我不知道伙伴的确切数量,没有它,我将无法编写SQL语句。如果我访问说:#$ {body ['partners'] [2] ['partnerName']}

,我会得到IndexOutOfBounds异常

但是传入的主体中只有一个伙伴。

那么我怎么能骆驼基于其长度在JSON内的嵌套地图上进行迭代,并为我的插入语句初始化我的PartnerName,PartnerLocation字段?

2 个答案:

答案 0 :(得分:1)

尝试这样:

            .setProperty("projectId", simple("body['projectId']"))
            .setProperty("title", simple("body['title']"))
            .setBody(simple("body['partners']"))
            .split(simple("body"))
            .process{//prepare your properties here}
            .end()
            .to("sql:classpath:sql/sql_queries.sql");

sql将如下所示:

INSERT INTO MY_TABLE(PID, TITLE, PartnerName1, PartnerLocation1, PartnerName2, PartnerLocation2, PartnerName3, PartnerLocation3) VALUES(:#${exchangeProperty.projectId}, :#${exchangeProperty.title}, :#${exchangeProperty.partnerName1}, :#${exchangeProperty.partnerLocation1} , :#${exchangeProperty.partnerName2}, :#${exchangeProperty.partnerLocation2}, :#${exchangeProperty.partnerName3}, :#${exchangeProperty.partnerLocation3}   )

UPD:用于1行中的所有数据

答案 1 :(得分:0)

最终做了这样的事情:

               .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    Map<String, Object> body = (Map<String, Object>) exchange.getIn().getBody();
                    int i = 1;
                    for(Map entry : (List<Map>)body.get("partners"))

                            {

                              exchange.setProperty("PartnerName"+i, entry.get("partnerName"));
                              exchange.setProperty("PartnerLocation"+i, entry.get("partnerLocation"));

                              i++;
                       }

然后最终在INSERT INTO(... PartnerName1,PartnerLocation1,PartnerName2,PartnerLocation2 .....)值(....:#$ {property.PartnerName1},:#$ {property。)中使用这些字段。 PartnerLocation1} ...)