我意识到there are a ton of Node modules that provide an async API for parsing JSON,但是其中许多似乎将整个文件或流读入内存,构造一个巨大的字符串,然后将其传递给JSON.parse()。这就是the second answer to "How to parse JSON using NodeJS?" suggests,也正是jsonfile module所做的。

构造巨型字符串正是我要避免的。我想要一个像这样的API:
parseJsonFile(pathToJsonFile): Promise
返回的Promise解析为解析的JSON对象的位置。此实现应使用恒定数量的内存。我对解析各种片段时广播事件的任何类似SAX的东西都不感兴趣:仅仅是最终结果。

我认为jsonparse可以满足我的要求(它显然包括无需使用JSON.parse()即可解析JSON的逻辑),但是README.md中没有简单的示例,而且one file in the examples directory似乎过于复杂。

最佳答案

我已经编写了执行此操作的模块:BFJ(大友好的JSON)。它导出了许多功能,它们在不同的抽象级别上运行,但它们都是异步的,并且在其核心是流式传输。

在最高级别上有两个用于读取和写入文件系统的函数bfj.readbfj.write。它们每个都返回一个 promise ,因此您可以这样称呼它们:

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 => {
    // :(
  });

在此级别上,还有一个用于将数据序列化为JSON字符串bfj.stringify的函数:
// Asynchronously serialize data to a JSON string
bfj.stringify(data)
  .then(json => {
    // :)
  })
  .catch(error => {
    // :(
  });

在它们之下是另外两个用于读取和写入流的通用函数bfj.parsebfj.streamify。这些用作高级功能的基础,但是您也可以直接调用它们:
// 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);

在最低级别,有两个类似于SAX解析器/序列化器的函数bfj.walkbfj.eventify。您不太可能希望直接调用它们,它们只是更高级别实现的胆量。

它是开源的,并且是MIT许可的。有关更多信息,请检查the readme

09-19 15:25