如何使用Apache Camel处理大型JSON数组

时间:2019-01-17 15:18:06

标签: java json jackson apache-camel

我想实现类似于CSV流处理的功能:

//read input file
.split(body().tokenize("\n", 100, false)).streaming()
            .unmarshal(new BindyCsvDataFormat( ...

我可以控制输入文件的内容,例如,我可以将每个JSON对象放在新行上,而无需在每个对象后面添加JSON开始数组和逗号:

{"id": "foo1"}
{"id": "foo2"}
...

然后遵循与CSV中相同的流程(拆分和流传输),但是我无法使用ListJacksonDataFormat.json(JsonLibrary.Jackson)来解组

如何执行此操作? 还是有另一种读取大JSON数组的方式?

注意: 此处理必须快速,因此我无法像先here所述先将csv编组为JSON,再将其编组为JSON(这似乎是一个解决方法)。

2 个答案:

答案 0 :(得分:0)

您可以使用jsonpath拆分JSon消息(并在Splitter EIP中启用流式传输更大的消息)

https://github.com/apache/camel/blob/master/components/camel-jsonpath/src/main/docs/jsonpath-language.adoc

答案 1 :(得分:0)

我最终得到了以下解决方案:

.split(body().tokenize("\n", 1_000, false))
.streaming()
.process(exchange -> {
    String[] body = exchange.getIn().getBody(String.class).split("\n");
    var records = new ArrayList<FooBar>(body.length);
    for(String line: body) {
         records.add(objectMapper.readValue(line, FooBar.class));
    }
    exchange.getIn().setBody(records);
})

objectMappercom.fasterxml.jackson.databind.ObjectMapper

例如,在约1.2分钟内处理了3.5 GB的文件。