【问题标题】:How to use streams to JSON stringify large nested objects in Node.js?如何在 Node.js 中使用流对大型嵌套对象进行 JSON 字符串化?
【发布时间】: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

【问题讨论】:

    标签: json node.js io stream jsonstream


    【解决方案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
    猜你喜欢
    • 2018-09-14
    • 2016-04-14
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多