603

This seems like a solved problem but I am unable to find a solution for it.

Basically, I read a JSON file, change a key, and write back the new JSON to the same file. All works, but I loose the JSON formatting.So, instead of:

{
 name:'test',
 version:'1.0'
}

I get

{name:'test',version:'1.1'}

Is there a way in Node.js to write well formatted JSON to file ?

Ben
57.6k50 gold badges187 silver badges229 bronze badges
asked Apr 14, 2011 at 23:10
2
  • JSON.stringify chokes on cyclic objects, and util.inspect doesn't produce valid json. :\ I found no [native] solution to pretty printing JSON in NodeJS Commented Jan 4, 2017 at 0:47
  • 1
    @ThorSummoner: That is a problem with JSON, not with Node—JSON does not natively support cyclic references. There is a solution here, in another question. Commented Mar 22, 2018 at 21:46

8 Answers 8

1137

JSON.stringify's third parameter defines white-space insertion for pretty-printing. It can be a string or a number (number of spaces). Node can write to your filesystem with fs. Example:

var fs = require('fs');
fs.writeFile('test.json', JSON.stringify({ a:1, b:2, c:3 }, null, 4));
/* test.json:
{
 "a": 1,
 "b": 2,
 "c": 3,
}
*/

See the JSON.stringify() docs at MDN, Node fs docs

worc
3,7853 gold badges33 silver badges36 bronze badges
answered Apr 14, 2011 at 23:34
Sign up to request clarification or add additional context in comments.

3 Comments

Note : instead of 4, use "\t" if you want tabs.
In latest nodejs you need to provide a callback function as third parameter, see this answer: stackoverflow.com/a/11677276/675065
@Alp means the third parameter of fs.writeFile; you don't actually have to use the callback if the write is the last command in your script. You only need the callback if you want to do something after writeFile, other than exit the process.
245

I think this might be useful... I love example code :)

var fs = require('fs');
var myData = {
 name:'test',
 version:'1.0'
}
var outputFilename = '/tmp/my.json';
fs.writeFile(outputFilename, JSON.stringify(myData, null, 4), function(err) {
 if(err) {
 console.log(err);
 } else {
 console.log("JSON saved to " + outputFilename);
 }
}); 

5 Comments

Make sure the tmp folder exist or else this might fail.
in most unix systems (including Mac & Linux..and if I recall BSD), tmp folder exists by default
what is the location(Output filename) to be given in case of windows
I don't know why my file didn't get written (just opened empty) without the callback... Or maybe it's async, and it didn't work because I had an exception thrown while app startup?
@TomaszGandor: All I/O in Node is async by default, so the writeFile call doesn't block the program. If you don't pass a callback, Node doesn't have any more code to run, so it exits immediately after the call, likely before the actual write finished.
129

If you just want to pretty print an object and not export it as valid JSON you can use console.dir().

It uses syntax-highlighting, smart indentation, removes quotes from keys and just makes the output as pretty as it gets.

const jsonString = `{"name":"John","color":"green",
 "smoker":false,"id":7,"city":"Berlin"}`
const object = JSON.parse(jsonString)
console.dir(object, {depth: null, colors: true})

Screenshot of logged object

Under the hood it is a shortcut for console.log(util.inspect(...)). The only difference is that it bypasses any custom inspect() function defined on an object.

answered Nov 14, 2015 at 10:04

3 Comments

console.dir doesn't produce valid json.
@GreggLind Clarified that in the answer!
This made my express server stall. I don't know why :(
59

If you don't want to store this anywhere, but just view the object for debugging purposes.

console.log(JSON.stringify(object, null, " "));

You can change the third parameter to adjust the indentation.

answered Sep 28, 2018 at 11:09

1 Comment

I've been looking for this solution -like for ever! The last param works like a charm!
48

I know this is old question. But maybe this can help you 😀

JSON string

var jsonStr = '{ "bool": true, "number": 123, "string": "foo bar" }';

Pretty Print JSON

JSON.stringify(JSON.parse(jsonStr), null, 2);

Minify JSON

JSON.stringify(JSON.parse(jsonStr));
answered Dec 5, 2020 at 6:02

Comments

32

what about this?

console.table(object)

sample

Samuel Philipp
11.1k12 gold badges41 silver badges58 bronze badges
answered Aug 8, 2019 at 11:44

1 Comment

this is a good solution for small datasets, but for large, complex, deeply nested objects it's essentially impossible to read with all the line wrapping. there might be a solution to that too I suppose.
5

Another workaround would be to make use of prettier to format the JSON. The example below is using 'json' parser but it could also use 'json5', see list of valid parsers.

const prettier = require("prettier");
console.log(prettier.format(JSON.stringify(object),{ semi: false, parser: "json" }));
answered Nov 16, 2020 at 15:02

Comments

-2

if prettify is name value pairs on new lines then specifying number of spaces in stringify didn't work for me the only thing that worked for me was

await fs.promises.writeFile('testdataattr.json',JSON.stringify(datatofile, null,'\r\n'),'utf8') ;
answered Mar 31, 2022 at 10:02

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.