Преобразование JSON с разделителями-запятыми в узел с разделителями новой строки

У меня есть файл 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)

что я упускаю из потоков?


person kisonay    schedule 23.09.2015    source источник
comment
source.son ← это опечатка?   -  person rjz    schedule 24.09.2015
comment
да, спасибо, исправил опечатку   -  person kisonay    schedule 24.09.2015


Ответы (3)


Один из способов преобразовать массив JSON в поток сущностей JSON, разделенных новой строкой, — использовать jq с параметром -c, например

$ jq -c ".[]"

Вход:

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

Выход:

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

См. https://stedolan.github.io/jq.

person peak    schedule 24.09.2015
comment
jq выглядит как отличный инструмент. Я предполагаю, что на данный момент моя проблема заключается в том, чтобы понять, как именно работает потоковая передача. Как я смогу прочитать файл, запустить его через jq и записать вывод? Вся документация по потоковой передаче (а мне не нужно использовать потоковую передачу) меня очень сбивает с толку. - person kisonay; 24.09.2015
comment
@kisonay - Вам вообще не нужно беспокоиться о потоковом парсере. Если ваш JSON находится в файле, скажем, input.json, вы можете (например) просто указать имя файла в качестве аргумента командной строки: jq -c .[] input.json - person peak; 24.09.2015
comment
ты спасатель! просто отправка вывода в файл > output.txt сделала именно то, что мне было нужно. Оставьте это мне, чтобы все усложнять! Спасибо. - person kisonay; 24.09.2015

Для всех, кто ищет решение о том, как преобразовать массив объектов 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.

Удачного кодирования :)

person Vishnu    schedule 26.09.2020

В 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()

Я не опытный специалист по узлам, поэтому прошу прощения, если код корявый, но он работает.

person Urvah Shabbir    schedule 10.06.2020