Запишіть об'єкти у файл за допомогою Node.js


83

Я шукав це по всьому stackoverflow / google, але не можу зрозуміти.

Я стираю посилання в соціальних мережах на вказану сторінку URL-адреси, і функція повертає об’єкт зі списком URL-адрес.

Коли я намагаюся записати ці дані в інший файл, вони видаються у файл [object Object]замість очікуваного: [' https://twitter.com/#!/101Cookbooks ', ' http://www.facebook.com/ 101cookbooks '], як це робиться, коли я отримую console.log()результати.

Це моя сумна спроба прочитати та записати файл у Node, намагаючись прочитати кожен рядок (url) та ввести через виклик функції request(line, gotHTML):

fs.readFileSync('./urls.txt').toString().split('\n').forEach(function (line){
    console.log(line); 
    var obj = request(line, gotHTML); 
    console.log(obj); 
    fs.writeFileSync('./data.json', obj , 'utf-8'); 
});   

для довідки - gotHTMLфункція:

function gotHTML(err, resp, html){ 
    var social_ids = []; 

    if(err){
        return console.log(err); 
    } else if (resp.statusCode === 200){ 
        var parsedHTML = $.load(html); 

        parsedHTML('a').map(function(i, link){
            var href = $(link).attr('href');
            for(var i=0; i<socialurls.length; i++){
                if(socialurls[i].test(href) && social_ids.indexOf(href) < 0 ) {
                    social_ids.push(href); 
                }; 
            }; 
        })
    };

    return social_ids;
};

3
[object Object]є об’єктом toString. Якщо ви хочете представити об'єкт, використовуйте JSON.stringify.
elclanrs

2
Будьте обережні з JSON.stringify. З масивами ви в безпеці, але коли об’єкти мають кругові посилання, це не вдасться ( див. Цю тему ). utilМодуль обробляє циклічні посилання.
Jim Schubert

Відповіді:


71

obj є масивом у вашому прикладі.

fs.writeFileSync (ім'я файлу, дані, [параметри]) вимагає Stringабо Bufferв параметрі даних. див. документи .

Спробуйте записати масив у формат рядка:

// writes 'https://twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks'
fs.writeFileSync('./data.json', obj.join(',') , 'utf-8'); 

Або:

// writes ['https://twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks']
var util = require('util');
fs.writeFileSync('./data.json', util.inspect(obj) , 'utf-8');

редагувати: Причиною того, що ви бачите масив у вашому прикладі, є те, що реалізація вузла console.logне просто викликає toString, а викликає util.format див. джерело console.js


5
Якщо ваш об'єкт містить великі масиви, це не спрацює, оскільки метод перевірки видасть щось на зразок "45000 більше ...]"
Кокс

96

Спираючись на те, що сказав deb2fast, я також передав би пару додаткових параметрів в JSON.stringify (), щоб отримати його в досить гарному форматі:

fs.writeFileSync('./data.json', JSON.stringify(obj, null, 2) , 'utf-8');

Другий параметр - це необов’язкова функція заміни, яка в цьому випадку вам не потрібна, тому nullпрацює.

Третій параметр - це кількість пробілів, які слід використовувати для відступу. 2 і 4, здається, популярний вибір.


це призведе до проблеми кругової залежності. двосторонні залежності неможливо перетворити в JSON.
Озан Ертюрк

У написаному текстовому файлі відсутній символ нового рядка в кінці файлу. Будь-яким способом це виправити?
friederbluemle

1
@friederbluemle - Ви могли б + '\n'до цього виклику stringify () додати цей новий рядок.
Guy

1
Це найкраще працювало для мене, оскільки використання прийнятої відповіді дало мені неправильний результат.
Аншуман Кумар

20

Якщо ви отримуєте, [object object]тоді використовуйтеJSON.stringify

fs.writeFile('./data.json', JSON.stringify(obj) , 'utf-8');

У мене це спрацювало.


10

З мого досвіду JSON.stringify трохи швидший, ніж util.inspect. Мені довелося зберегти об'єкт результату запиту DB2 як файл json. Запит повернув об'єкт у 92 тис. Рядків, перетворення зайняло дуже багато часу з util.inspect, тому я зробив наступний тест, написавши той самий об'єкт запису 1000 до файлу за допомогою обох методів.

  1. JSON.Stringify

    fs.writeFile('./data.json', JSON.stringify(obj, null, 2));
    

Час: 3:57 (3 хв. 57 сек.)

Формат результату:

[
  {
    "PROB": "00001",
    "BO": "AXZ",
    "CNTRY": "649"
   },
  ...
]
  1. util.inspect

    var util = require('util');
    fs.writeFile('./data.json', util.inspect(obj, false, 2, false));
    

Час: 4:12 (4 хв. 12 сек.)

Формат результату:

[ { PROB: '00001',
    BO: 'AXZ',
    CNTRY: '649' },
    ...
]

4

чи можете ви спробувати зробити JSON.stringify (obj);

Подобається це

 var stringify = JSON.stringify(obj);
fs.writeFileSync('./data.json', stringify , 'utf-8'); 

1

Просто, якщо хтось ще натрапить на це, я використовую бібліотеку fs-extra у вузлі та записую об'єкти javascript у такий файл:

const fse = require('fs-extra');
fse.outputJsonSync('path/to/output/file.json', objectToWriteToFile); 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.