如何用Apache Camel处理大JSON数组

rqdpfwrv  于 2022-12-29  发布在  Apache
关注(0)|答案(2)|浏览(135)

我希望实现类似于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(这似乎是一个粗略的解决方案)。

mftmpeh8

mftmpeh81#

您可以使用jsonpath来分割JSon消息(并在Splitter EIP中为更大的消息启用流)
https://github.com/apache/camel/blob/master/components/camel-jsonpath/src/main/docs/jsonpath-language.adoc

twh00eeo

twh00eeo2#

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

.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);
})


例如,处理一个3.5 GB的文件需要约1.2分钟。

相关问题