Я написал модуль, который может это сделать, называется BFJ . В частности, метод bfj.match
можно использовать для разбиения большого потока на дискретные куски JSON:
const bfj = require('bfj');
const fs = require('fs');
const stream = fs.createReadStream(filePath);
bfj.match(stream, (key, value, depth) => depth === 0, { ndjson: true })
.on('data', object => {
// do whatever you need to do with object
})
.on('dataError', error => {
// a syntax error was found in the JSON
})
.on('error', error => {
// some kind of operational error occurred
})
.on('end', error => {
// finished processing the stream
});
Здесь bfj.match
возвращает читаемый поток объектного режима, который получит разобранный элементов данных и передано 3 аргумента:
При вызове bfj.match
будет анализировать JSON из глубины входного потока - сначала, вызывая предикат с каждым значением, чтобы определить, будет ли этот элемент передаваться в поток результатов. Предикат передается по трем аргументам:
undefined
для элементов верхнего уровня). Конечно, более сложный предикат также может быть использован по мере необходимости в соответствии с требованиями. Вы также можете передать строку или регулярное выражение вместо функции предиката, если вы хотите выполнить простые совпадения с ключами свойств.