如何在 Node.js 中使用流对大型嵌套对象进行 JSON 字符串化?
Posted
技术标签:
【中文标题】如何在 Node.js 中使用流对大型嵌套对象进行 JSON 字符串化?【英文标题】:How to use streams to JSON stringify large nested objects in Node.js? 【发布时间】:2015-12-02 08:57:27 【问题描述】:我有一个大型 javascript 对象,我想将其转换为 JSON 并写入文件。我以为我可以使用这样的流来做到这一点
var fs = require('fs');
var JSONStream = require('JSONStream');
var st = JSONStream.stringifyObject()
.pipe(fs.createWriteStream('./output_file.js'))
st.write(large_object);
当我尝试这个时,我得到一个错误:
stream.js:94
throw er; // Unhandled stream error in pipe.
^
TypeError: Invalid non-string/buffer chunk
at validChunk (_stream_writable.js:153:14)
at WriteStream.Writable.write (_stream_writable.js:182:12)
所以显然我不能只给这个stringifyObject
写一个对象。我不确定下一步是什么。我需要将对象转换为缓冲区吗?通过一些转换流运行对象并将其通过管道传输到strinigfyObject
【问题讨论】:
【参考方案1】:JSONStream 不是这样工作的,但是由于您的大对象已经加载到内存中,所以没有意义。
var fs = require('fs-extra')
var file = '/tmp/this/path/does/not/exist/file.txt'
fs.outputJson(file, name: 'JP', function (err)
console.log(err) // => null
);
这将写入 JSON。
如果你想使用 JSONStream,你可以这样做:
var fs = require('fs');
var jsonStream = require('JSONStream');
var fl = fs.createWriteStream('dat.json');
var out = jsonStream.stringifyObject();
out.pipe(fl);
obj = test:10, ok: true ;
for (key in obj) out.write([key, obj[key]]);
out.end();
【讨论】:
你的第一个建议导致FATAL ERROR: JS Allocation failed - process out of memory
我只是将第二个更改为适合您情况的确切代码,除非大数组是一个数组。试试看。
我尝试了第二个版本,但是我有一个大型嵌套对象作为obj[key]
值之一,这就是引发内存分配错误的原因。我需要一些类似于子对象递归的东西
@kevzettler 请问你是怎么用递归解决的?
我创建了一个使用 TransformStream 流式传输 json 的要点:gist.github.com/adrai/713b298fd83da0063910aa9f1674a5ed以上是关于如何在 Node.js 中使用流对大型嵌套对象进行 JSON 字符串化?的主要内容,如果未能解决你的问题,请参考以下文章