使用Node.js将对象写入文件


80

我已经在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;
};

2
[object Object]是一个对象toString。如果要表示对象,请使用JSON.stringify
elclanrs 2014年

2
请注意JSON.stringify。使用数组是安全的,但是当对象具有循环引用时,它将失败(请参阅本主题)。该util模块处理循环引用。
Jim Schubert

Answers:


68

obj 是您的示例中的数组。

fs.writeFileSync(filename,data,[options])需要StringBuffer在data参数中。查看文件

尝试以字符串格式编写数组:

// 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 see console.js source


5
如果您的对象包含大数组,则此方法将不起作用,因为inspect方法将输出类似“ 45000 more ...]”的内容
Coxer

93

在deb2fast所说的基础上,我还将一些额外的参数传递给JSON.stringify(),以使其达到漂亮的格式:

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

第二个参数是可选的替换函数,在这种情况下,您不需要此函数null

第三个参数是用于缩进的空格数。2和4似乎是受欢迎的选择。


这将导致循环依赖问题。双向依赖关系无法转换为JSON。
OzanErtürk17年

书面文本文件在文件末尾缺少换行符。有任何解决这个问题的方法吗?
friederbluemle

1
@friederbluemle-您可以+ '\n'在stringify()调用中添加该换行符。
盖伊,

20

如果您正在[object object]使用,请使用JSON.stringify

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

它为我工作。


10

以我的经验,JSON.stringify比util.inspect快一点。我必须将DB2查询的结果对象另存为json文件,该查询返回了92k行的对象,转换花费了很长时间才能完成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. 实用程序检查

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

时间:4:12(4分12秒)

结果格式:

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


0

以防万一其他人偶然发现此问题,我在节点中使用fs-extra库并将javascript对象写入如下文件:

const fse = require('fs-extra');
fse.outputJsonSync('path/to/output/file.json', objectToWriteToFile); 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.