我意识到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.read
和bfj.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.parse
和bfj.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.walk
和bfj.eventify
。您不太可能希望直接调用它们,它们只是更高级别实现的胆量。它是开源的,并且是MIT许可的。有关更多信息,请检查the readme。