การเขียนออบเจ็กต์ JSON ไปยังไฟล์ JSON ด้วย fs.writeFileSync


116

ฉันพยายามเขียนออบเจ็กต์ JSON ลงในไฟล์ JSON โค้ดดำเนินการโดยไม่มีข้อผิดพลาด แต่แทนที่จะเขียนเนื้อหาของอ็อบเจ็กต์ทั้งหมดที่เขียนลงในไฟล์ JSON คือ:

[object Object]

นี่คือรหัสที่เขียนจริง:

fs.writeFileSync('../data/phraseFreqs.json', output)

'output' เป็นออบเจ็กต์ JSON และมีไฟล์อยู่แล้ว โปรดแจ้งให้เราทราบหากต้องการข้อมูลเพิ่มเติม


11
fs.writeFileSync ('../ data / phraseFreqs.json', JSON.stringify (เอาต์พุต))
Daniel

เป็นไปได้ที่จะทำซ้ำการเขียนวัตถุลงในไฟล์ด้วย Node.js
Neeraj Sewani

คำตอบ:


169

คุณต้องสตริงวัตถุ

fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output));

2
ยินดีต้อนรับสู่ SO ก่อนตอบคำถามลองทบทวนคำตอบที่มีอยู่ หากคำตอบของคุณได้รับการแนะนำแล้วให้โหวตคะแนนคำตอบนั้นแทน ดูคู่มือชุมชนสำหรับการเขียนคำตอบที่ดี
LightBender

44
ฉันชอบที่สิ่งนี้ตอบคำถามโดยไม่มีความคิดเห็นว่าควรใช้การดำเนินการแบบซิงโครนัสเทียบกับ async หรือไม่
Brian Duncan

1
เพื่อจุดประสงค์ในการอ่านคุณสามารถใช้พารามิเตอร์ space ของเมธอด JSON.stringify: fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output, null, 2));เพิ่มเติม: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Binh

48

ฉันไม่คิดว่าคุณควรใช้วิธีซิงโครนัสการเขียนข้อมูลไปยังไฟล์แบบอะซิงโครนัสจะดีกว่าoutputหากเป็นobjectไฟล์.

หมายเหตุ: ถ้าoutputเป็นสตริงให้ระบุการเข้ารหัสและจำflagตัวเลือกด้วย:

const fs = require('fs');
const content = JSON.stringify(output);

fs.writeFile('/tmp/phraseFreqs.json', content, 'utf8', function (err) {
    if (err) {
        return console.log(err);
    }

    console.log("The file was saved!");
}); 

เพิ่มวิธีการเขียนข้อมูลแบบซิงโครนัสลงในไฟล์ แต่โปรดพิจารณากรณีการใช้งานของคุณ Asynchronous vs Synchronous Execution แปลว่าอะไร?

const fs = require('fs');
const content = JSON.stringify(output);

fs.writeFileSync('/tmp/phraseFreqs.json', content);

9
หากกำลังทำในสคริปต์สั้น ๆ หรืออะไรบางอย่างซิงโครนัสก็ใช้ได้ หากเป็นส่วนหนึ่งของคำขอเซิร์ฟเวอร์หรือบางอย่างควรเป็นแบบอะซิงโครนัส
Hilton Shumway

1
ไม่จำเป็นต้องทำกระบวนการที่ถูกผูกไว้ I / O แบบอะซิงโครนัส แต่ขึ้นอยู่กับความซับซ้อนของสคริปต์สั้น ๆ ที่คุณอาจเลือกใช้ซิงโครนัส
akinjide

4
นี่ไม่ใช่คำตอบสำหรับคำถาม
Stephan Bijzitter

6
ผู้ใช้ถามหาวิธีซิงโครนัสโดยเฉพาะ
Anthony

7
กรุณาหยุดพูดว่า async ดี และหมายถึงการซิงค์ไม่ดี หากคุณกังวลเกี่ยวกับความเร็ว Webpack ของคุณควรทำการเพิ่มประสิทธิภาพให้คุณ คุณไม่ใช่ผู้เพิ่มประสิทธิภาพ เหตุผล: จำเป็นต้องมีการเขียนไฟล์ซิงค์สำหรับเครื่องมือบรรทัดคำสั่ง json ซึ่งจะต้องปิดไฟล์ใด ๆ ที่เปิดอยู่ก่อนที่จะส่งข้อมูลไปยังแอปถัดไปในเครือข่าย
TamusJRoyce

27

ทำให้ json human สามารถอ่านได้โดยส่งอาร์กิวเมนต์ที่สามไปที่stringify:

fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output, null, 4));

1

เมื่อส่งข้อมูลไปยังเว็บเซิร์ฟเวอร์ข้อมูลจะต้องเป็นสตริง ( ที่นี่ ) คุณสามารถแปลงออบเจ็กต์ JavaScript เป็นสตริงด้วยJSON.stringify()ไฟล์. นี่คือตัวอย่างการทำงาน:

var fs = require('fs');

var originalNote = {
  title: 'Meeting',
  description: 'Meeting John Doe at 10:30 am'
};

var originalNoteString = JSON.stringify(originalNote);

fs.writeFileSync('notes.json', originalNoteString);

var noteString = fs.readFileSync('notes.json');

var note = JSON.parse(noteString);

console.log(`TITLE: ${note.title} DESCRIPTION: ${note.description}`);

หวังว่ามันจะช่วยได้


1

นี่คือรูปแบบที่ใช้เวอร์ชันfsที่ใช้สัญญา:

const fs = require('fs');

await fs.promises.writeFile('../data/phraseFreqs.json', JSON.stringify(output)); // UTF-8 is default
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.