NodeJS JSON.stringify非常长的对象数组错误"无效的字符串长度"

时间:2015-11-12 16:40:12

标签: json node.js

我有一个非常长的对象数组,大小约为100,000个项目,在我将其写入文件之前,我将数据传递给JSON.stringify

我收到此错误:

JSON.stringify(
     ^
RangeError: Invalid string length

如何成功地对一个非常大的json对象进行字符串化?

更新

因为我最初写过这个问题,所以我对处理大量数据变得更加熟悉了,我更喜欢使用Apache Spark来完成这个过程。在Spark中,习惯上不使用大型JSON数组,而是使用包含长串JSON的流或文件,每行一个对象。文件看起来像这样:

{"name":"kristian", "favoriteSong":"enter sandman"}
{"name":"joshua", "favoriteSong":"penny lane"}
{"name":"susan", "favoriteSong":"all about that bass"}

这很好,因为:

  • 你可以任意处理TB级大的文件,就像轻松做一些无逻辑文件分割并将其转换成一千个较小的文件一样,逻辑就是简单地在某个换行符号N处打破文件。
  • 最好不要因为未关闭的JSON数组而导致手上有损坏的数据文件这个潜在的可怕问题。
  • 文件中的大型JSON数组往往没有换行符,因此大型文件在VIM或其他编辑器中打开很麻烦,因为它试图将整个内容加载到内存中,而不是带有换行符的文件,在没有问题的情况下,它可以轻松地将前10行左右加载到屏幕上。

2 个答案:

答案 0 :(得分:11)

我发现 JSONStream 是原生 JSON.stringify 的可靠替代品,适用于大型对象。例如:

var fileSystem = require( "fs" );
var JSONStream = require( "JSONStream" );
var records = [
    { id: 1, name: "Terminator" },
    { id: 2, name: "Predator" },
    { id: 3, name: "True Lies" },
    { id: 4, name: "Running Man" },
    { id: 5, name: "Twins" }
    // .... hundreds of thousands of records ....
];

var transformStream = JSONStream.stringify();
var outputStream = fileSystem.createWriteStream( __dirname + "/data.json" );
transformStream.pipe( outputStream );    
records.forEach( transformStream.write );
transformStream.end();

outputStream.on(
    "finish",
    function handleFinish() {
        console.log("Done");
    }
);

here获取示例代码。

答案 1 :(得分:5)

  

如何成功地对一个非常大的json对象进行字符串化?

部分?例如,将数组分成较小的部分,在较小的部分上使用JSON.stringify,并将每个部分附加到文件中(您必须执行一些[,,和]处理。)