是否有一个asynchronousJSONparsing器的Node模块不会将整个JSONstring加载到内存中?

我意识到有很多Node模块提供了parsingJSON的asynchronousAPI ,但是其中许多模块似乎将整个文件或stream读入内存,构build一个巨大的string,然后将其传递给JSON.parse() 。 这是“如何使用NodeJSparsingJSON?”的第二个答案。 build议 ,而且正是jsonfile模块所做的。

构build一个巨大的string正是我想要避免的。 我想要一个像这样的API:

parseJsonFile(pathToJsonFile): Promise

返回的Promiseparsing为parsing的JSON对象。 这个实现应该使用恒定的内存量。 我对任何类似SAX的东西都不感兴趣,因为在parsing各种片断时广播事件只是最终的结果。

我认为jsonparse可以做我想做的事情(它明显包括了parsingJSON而不使用JSON.parse() )的逻辑,但是在README.md没有简单的例子, 示例目录中的一个文件看起来过于复杂。

jsonparse是一个stream式jsonparsing器,示例代码已经显示了使用Nodestream的最小值。

  1. client.request()更改为fs.createReadStream()
  2. 在文件读取stream上设置on('data')侦听器,类似于示例中的on('response')

我写了一个模块: BFJ (友好的JSON)。 它导出了一系列在不同抽象层次上运行的函数,但它们的核心都是asynchronous和stream式的。

最高级别是读取和写入文件系统的两个函数, bfj.readbfj.write 。 他们各自回报一个承诺,所以你这样称呼他们:

 var bfj = require('bfj'); // Asynchronously read from a JSON file on disk bfj.read(path) .then(data => { // :) }) .catch(error => { // :( }); // Asynchronously write to a JSON file on disk bfj.write(path, data) .then(data => { // :) }) .catch(error => { // :( }); 

同样在这个级别是一个函数,用于将数据序列化到JSONstring,称为bfj.stringify

 // Asynchronously serialize data to a JSON string bfj.stringify(data) .then(json => { // :) }) .catch(error => { // :( }); 

在这些下面是两个更通用的function,读取和写入stream, bfj.parsebfj.streamify 。 这些作为高级function的基础,但您也可以直接打电话给他们:

 // Asynchronously parse JSON from a readable stream bfj.parse(readableStream). .then(data => { // :) }) .catch(error => { // :( }); // Asynchronously serialize data to a writable stream of JSON bfj.streamify(data). .pipe(writableStream); 

在最底层,有两个与SAXparsing器/序列化器, bfj.walkbfj.eventify 。 你不可能直接打电话给他们,他们只是高层实施的内容。

它是开放源代码和MIT许可的。 有关更多信息,请查阅自述文件 。