4

我有一个 JSON 文件,我正在使用节点读取,修改它并将其保存为 json 文件。

我希望将新的 json 保存为换行符分隔而不是在数组中。

我遇到了https://github.com/CrowdProcess/newline-json但不完全理解流。如果我有以下流设置,如何通过解析器和字符串化器对其进行管道传输?

fileStream = fs.createReadStream('source.json')
writeStream = fs.createWriteStream('output.txt');

var Parser = require('newline-json').Parser;
var Stringifier = require('newline-json').Stringifier;

var parser = new Parser();
var stringifier = new Stringifier();

但运行以下仅输出一个空白文件。

fileStream.pipe(parser).pipe(stringifier).pipe(writeStream)

我对流缺少什么?

4

3 回答 3

15

将 JSON 数组转换为以换行符分隔的 JSON 实体流的一种方法是将 jq 与 -c 选项一起使用,例如

$ jq -c ".[]"

输入:

[[1,2], 3, {"4":5}]

输出:

[1,2]
3
{"4":5}

https://stedolan.github.io/jq

于 2015-09-24T01:39:34.743 回答
10

对于任何正在寻找如何将对象的 json 数组转换为 nd-json的解决方案的人。这是解决方案:

输入:

const arrObj = [{
  id: 1,
  name: 'joe'
}, {
  id: 2,
  name: 'ben'
}, {
  id: 3,
  name: 'jake'
}, {
  id: 4,
  name: 'marsh'
}];

// stringify the object and join with \n
const ndJson = arrObj.map(JSON.stringify).join('\n');

console.log(ndJson);

输出:

{"id":1,"name":"joe"}
{"id":2,"name":"ben"}
{"id":3,"name":"jake"}
{"id":4,"name":"marsh"}

示例用例:将批量请求从 json 文件导入elasticsearch时。

快乐编码:)

于 2020-09-26T12:16:34.243 回答
1

在 node.js 中,您可以使用该node-jq包执行@peak 上面显示的操作。

var stream = require('stream');
var fs = require('fs');
const jq = require('node-jq');

var fileName = 'YOUR_FILE_NAME'; //e.g abc.json
var bucketName = 'YOUR_BUCKET NAME'; // e.g gs://def
var dataStream = new stream.PassThrough();


async function formatJson() {

    jq.run('.[]', fileName, {output: 'compact'})
    .then((output) => {
        dataStream.push(output)
        dataStream.push(null)
        console.log(dataStream)    
    })
    .catch((err) => {
        console.log(err)
    })
}

formatJson()

我不是一个经验丰富的节点人,所以如果代码笨拙但它有效,请道歉。

于 2020-06-10T05:37:18.713 回答