将JSON可解析的数组流式传输到文件

时间:2018-08-02 11:04:34

标签: javascript json node.js stream

因此,您正在从文件读取数据,清除数据并将其写回到另一个文件,但是新文件不接受JSON格式。


您需要在新文件中填充一个对象。您可以从文件中获取大块,对其进行更改,然后将其保存到新文件中。

为此,您可以将数据流传输出去,编辑块,然后将其流回到另一个文件中。很好。

您一定要在每个项目之后添加,,以便以后可以读取数组, 但现在最后一项的末尾有逗号, ...

您不知道原始文件中的项目数,也不知道阅读器何时位于最后一个项目。

在该数组上使用类似JSONStream的东西,但是JSONStream也未提供索引。 唯一的结束事件是针对您的writersreaders的。

如何在写之前/之后删除结尾的逗号?

read_file = 'animals.json' //very large file
write_file = 'brown_dogs.json' //moderately large file

let read_stream = fs.createReadStream(read_file);
let write_stream = fs.createWriteStream(write_file);
let dog_stream = require('JSONStream').parse('array_of_animals.dogs.*');


write_stream
    .on('finish', () => {
        //the writer is done writing my list of dogs, but my array has a
        //trailing comma, now my brown_dogs.json isn't parsable
    })
    .write('{"brown_dogs": ['); //lets start

read_stream
    .pipe(dog_stream)
    .on('data', dog => {
    //basic logic before we save the item 
        if (dog._fur_colour === 'brown'){
            let _dog = {
                    type : dog._type,
                    colour : dog._fur_colour,
                    size : dog._height
                }
            };
            //we write our accepted dog
            write_stream.write(JSON.stringify(_dog) + ',');
        }
    })
    .on('end', () => {
       //done reading animals.json
        write_stream.write(']}');
    })

-

如果生成的JSON文件很小,则可以简单地将所有狗添加到数组中,并且一次性将所有内容保存到文件中。这意味着该文件不仅是JSON友好的,而且足够小,可以简单地通过JSON.parse()

打开

如果生成的JSON文件很大,则在任何情况下都可能需要流式传输项目。幸运的是,JSONStream使我们不仅可以单独提取每条狗,还可以忽略尾随的逗号。

这就是我所理解的解决方案……但我认为这并不完美。无论大小如何,为什么文件都不能接受JSON。

2 个答案:

答案 0 :(得分:0)

我认为

我为此在toJSONArray see docs here中添加了scramjet方法。它仅在各块之间放置一个逗号。

代码如下:

fs.createReadStream(read_file)
    .pipe(require('JSONStream').parse('array_of_animals.dogs.*'))
    .pipe(new DataStream())
    .filter(dog => dog._fur_colour === 'brown') // this will filter out the non-brown dogs.
    .map(dog => { // remap the data
        reutrn {
            type : dog._type,
            colour : dog._fur_colour,
            size : dog._height
        };
    })
    .toJSONArray(['{"brown_dogs": [', ']}']) // add your enclosure
    .pipe(fs.createWriteStream(write_file));

这段代码应该可以制作出精美的JSON。

答案 1 :(得分:0)

这实际上很简单。 将一个空字符串var添加到插入的开头。第一次插入后,将字符串设置为分隔符。

//update this string after the first insert
let separator = '';

read_stream
    .pipe(dog_stream)
    .on('data', dog => {
        //basic logic before we save the item 
        if (dog._fur_colour === 'brown'){
            let _dog = {
                    type : dog._type,
                    colour : dog._fur_colour,
                    size : dog._height
                }
            };
            //we write our accepted dog
            write_stream.write(separator + JSON.stringify(_dog));

            //update this after first insert
            separator = ',';
        }
    })