151

I am trying to write a JSON object to a JSON file. The code executes without errors, but instead of the content of the object been written, all that gets written into the JSON file is:

[object Object]

This is the code that actually does the writing:

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

'output' is a JSON object, and the file already exists. Please let me know if more information is required.

2
  • 12
    fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output)) Commented Feb 11, 2017 at 17:41
  • Possible duplicate of Write objects into file with Node.js Commented Nov 2, 2018 at 12:23

5 Answers 5

221

You need to stringify the object.

fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output));
Sign up to request clarification or add additional context in comments.

3 Comments

Welcome to SO, before answering a question, try to review the existing answer. If your answer has already been suggested, upvote that answer instead. See the community guide for writing a good answer.
I like that this answers the question without opinions about whether or not to use synchronous vs async operations.
For readability purposes, you can use the space parameter of the JSON.stringify method: fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output, null, 2)); More: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
54

I don't think you should use the synchronous approach, asynchronously writing data to a file is better also stringify the output if it's an object.

Note: If output is a string, then specify the encoding and remember the flag options as well.:

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!");
}); 

Added Synchronous method of writing data to a file, but please consider your use case. Asynchronous vs synchronous execution, what does it really mean?

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

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

8 Comments

If it's being done in a short script or something, synchronous is fine. If it's part of a server request or something, then it should be asynchronous.
Not necessarily, I/O bound processes should be made asynchronous, but depending on the short script complexity you might opt in for synchronous.
This is not an answer to the question.
User specifically asked for synchronous method
Please stop saying async good. And implying sync bad. If you are worried about speed, your webpack should do that optimization for you. You are not an optimizer. Reason: sync file writing is needed for json command-line tools. Which must close any files they have open before piping data to the next app in the chain.
|
38

Make the json human readable by passing a third argument to stringify:

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

Comments

1

When sending data to a web server, the data has to be a string (here). You can convert a JavaScript object into a string with JSON.stringify(). Here is a working example:

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}`);

Hope it could help.

Comments

1

Here's a variation, using the version of fs that uses promises:

const fs = require('fs');

await fs.promises.writeFile('../data/phraseFreqs.json', JSON.stringify(output)); // UTF-8 is default

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.