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 2014

2
に注意してくださいJSON.stringify。配列を使用すると安全ですが、オブジェクトに循環参照がある場合は失敗します(このトピックを参照)。utilモジュールは、循環参照を処理します。
ジムシューベルト

回答:


71

obj あなたの例では配列です。

fs.writeFileSync(filename、data、[options])には、StringまたはBufferdataパラメーターのいずれかが必要です。ドキュメントを参照してください

配列を文字列形式で記述してみてください。

// 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単に呼び出すのではなくtoStringseeconsole.jsソースを呼び出すutil.format ためです。


5
オブジェクトに大きな配列が含まれている場合、inspectメソッドは「
45000more

96

deb2fastが言ったことに基づいて、JSON.stringify()にいくつかの追加パラメーターを渡して、きれいな形式にします。

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

2番目のパラメーターはオプションの置換関数であり、この場合は不要なのでnull機能します。

3番目のパラメーターは、インデントに使用するスペースの数です。2と4が人気のある選択肢のようです。


循環依存の問題が発生します。双方向の依存関係をJSONに変換できませんでした。
オザンErtürk

書き込まれたテキストファイルには、ファイルの最後に改行文字がありません。これを修正する方法はありますか?
friederbluemle

1
@ friederbluemle-そのstringify + '\n'()呼び出しに、その改行を追加することができます。
ガイ

1
受け入れられた答えを使用すると間違った結果が得られたため、これは私にとって最も効果的でした。
AnshumanKumar20年

20

あなたはgetingている場合は[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. 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); 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.