Java 如何使用ApacheCamel处理大型JSON数组
我想实现与CSV流式处理类似的功能:Java 如何使用ApacheCamel处理大型JSON数组,java,json,jackson,apache-camel,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中的相同流程(拆分和
//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数组的方法
注意:
这种处理必须很快,因此我无法按照说明将csv解组然后封送JSON(这似乎是一个很好的解决办法)。您可以使用jsonpath拆分JSON消息(并在拆分器EIP中为更大的消息启用流式处理)
我最终得到了以下解决方案:
.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);
})
.split(body().tokenize(“\n”,1\u 000,false))
.streaming()
.流程(交换->{
String[]body=exchange.getIn().getBody(String.class).split(“\n”);
var记录=新的ArrayList(body.length);
for(字符串行:正文){
add(objectMapper.readValue(line,FooBar.class));
}
exchange.getIn().setBody(记录);
})
objectMapper
是com.fasterxml.jackson.databind.objectMapper
例如,一个3.5 GB的文件在大约1.2分钟内处理完毕。在使用CSV时,我发现分批处理(例如,一次处理100个对象)比逐个处理快,但我不知道如何使用json path做到这一点。我只有一个大阵列,包含多达10k的小对象。