我想实现类似于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(这似乎是一个解决方法)。
答案 0 :(得分:0)
您可以使用jsonpath拆分JSon消息(并在Splitter EIP中启用流式传输更大的消息)
答案 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);
})
objectMapper
是com.fasterxml.jackson.databind.ObjectMapper
例如,在约1.2分钟内处理了3.5 GB的文件。