如何在 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 字符串化?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 循环遍历嵌套的 Javascript 对象

node.js 中的嵌套承诺是不是正常?

Node.js:如何使用循环引用序列化大对象

如何使用 protobuf 序列化大型嵌套数组?

在 Node.js 中解析大型 XML 文件

如何使用 Socket.io 和 Node.js 开发大型聊天应用程序 [关闭]