我已经在stackoverflow / google上搜索了这个,但似乎无法弄明白。
我正在抓取给定网址页面的社交媒体链接,该函数返回一个包含网址列表的对象。
当我尝试将此数据写入另一个文件时,它会以[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;
};
答案 0 :(得分:70)
在deb2fast所说的基础上,我还会将一些额外的参数传递给JSON.stringify(),以使其格式相同:
fs.writeFile('./data.json', JSON.stringify(obj, null, 2) , 'utf-8');
第二个参数是一个可选的替换函数,在这种情况下您不需要null
。{/ p>
第三个参数是用于缩进的空格数。 2和4似乎是受欢迎的选择。
答案 1 :(得分:53)
obj
是您示例中的数组。
fs.writeFileSync(文件名,数据,[选项])需要数据参数中的String
或Buffer
。 see docs
尝试以字符串格式编写数组:
// 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
答案 2 :(得分:15)
如果您正在考虑[object object]
,请使用JSON.stringify
fs.writeFile('./data.json', JSON.stringify(obj) , 'utf-8');
它对我有用。
答案 3 :(得分:9)
根据我的经验,JSON.stringify比util.inspect稍快。 我不得不将DB2查询的结果对象保存为json文件,查询返回了92k行的对象,转换需要很长时间才能完成util.inspect,所以我通过编写相同的1000记录对象进行了以下测试使用这两种方法的文件。
JSON.Stringify
fs.writeFile('./data.json', JSON.stringify(obj, null, 2));
时间:3:57(3分57秒)
结果格式:
[
{
"PROB": "00001",
"BO": "AXZ",
"CNTRY": "649"
},
...
]
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 :(得分:2)
进一步了解@Jim Schubert
和@deb2fast
的回答:
为了能够写出大于 objects
的大 ~100 MB
订单,您需要使用 for...of 如下所示并符合您的要求。
const fsPromises = require('fs').promises;
const sampleData = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};
const writeToFile = async () => {
for (const dataObject of Object.keys(sampleData)) {
console.log(sampleData[dataObject]);
await fsPromises.appendFile( "out.json" , dataObject +": "+ JSON.stringify(sampleData[dataObject]));
}
}
writeToFile();
有关 node.js
限制的完整参考,请参阅 https://stackoverflow.com/a/67699911/3152654
答案 5 :(得分:1)
您可以尝试执行JSON.stringify(obj);
赞
var stringify = JSON.stringify(obj);
fs.writeFileSync('./data.json', stringify , 'utf-8');
答案 6 :(得分:0)
以防万一其他人偶然发现此问题,我在节点中使用了fs-extra库并将javascript对象写入这样的文件中:
const fse = require('fs-extra');
fse.outputJsonSync('path/to/output/file.json', objectToWriteToFile);