DEV Community

Samantha Ming
Samantha Ming

Posted on

Pretty JSON Output

Code Tidbit by SamanthaMing.com

Tired of the one-liner JSON output, well no more! Utilize JSON.stringify built-in pretty printing. Set the 3rd parameter with your desired spacing level 👍 Bam, instant GLAM✨

const protein = {steak: '🥩', bacon: '🥓'};

JSON.stringify(protein);
// {"steak":"🥩","bacon":"🥓"}

JSON.stringify(protein, null, 2);
/*
{
  "steak": "🥩",
  "bacon": "🥓"
}
*/
Enter fullscreen mode Exit fullscreen mode

Tab Spacing 😉

But the Tab folks are like how about us?? Don’t worry, you can also pass "\t" for tab level spacing 😄

const protein = {steak: '🥩', bacon: '🥓'};

JSON.stringify(protein, null, "\t");

/*
{
    "steak": "🥩",
    "bacon": "🥓"
}
*/
Enter fullscreen mode Exit fullscreen mode

Understanding the "Space" argument

The 3rd parameter of the JSON.stringify is used to control the spacing. It's what gives you that pretty string output.

It allows 2 types of arguments: Number and String.

a. Number

You can use any number from 0 to 10 as your indentation.

const protein = {steak: '🥩', bacon: '🥓'};

JSON.stringify(protein, null, 1);
/*
{
 "steak": "🥩",
 "bacon": "🥓"
}
*/
Enter fullscreen mode Exit fullscreen mode

b. String

Alternatively, you can use a string as your indentation. It allows a maximum of 10 characters. If you try to pass more than 10, it will just use the first 10 characters. So don't try to beat the system 😝

const protein = {steak: '🥩', bacon: '🥓'};

JSON.stringify(protein, null, "I 💛");
/*
{
I 💛"steak": "🥩",
I 💛"bacon": "🥓"
}
*/
Enter fullscreen mode Exit fullscreen mode

What is the 2nd parameter 🤔

The 2nd parameter is also called the replacer parameter. You can use it to transform the result.

It allows 2 types of arguments: Array and Function.

a. Array

I want to show you something really interesting when you pass in an array. You can use it to cherry pick the key-value pair that you want to output.

const protein = {
  steak: '🥩', 
  bacon: '🥓',
  pop: '🥤',
  tea: '🍵',
  shrimp: '🍤',
};

JSON.stringify(protein, ['steak', 'pop'], 2);
/*
{
  "steak": "🥩",
  "pop": "🥤"
}
*/
Enter fullscreen mode Exit fullscreen mode

b. Function

The replacer is called for each item. So you can also pass in a function. This means you can loop over each item and with each pass, manipulate with the logic defined in your function.

Here's an example, where I skip over the properties where the value is not a string. In other words, I only want to show the items where the value is a number.

const protein = {
  steak: '🥩', 
  calorie: 271,
  bacon: '🥓',
  sodium: 58,
};

const replacer = function(key, value) {
  if(typeof value !== "string") {
    return value
  }
  return undefined;
}


JSON.stringify(protein, replacer, 2);
/*
{
  "calorie": 271,
  "sodium": 58
}
*/
Enter fullscreen mode Exit fullscreen mode

Resources


Thanks for reading ❤
Say Hello! Instagram | Twitter | Facebook | Medium | Blog

Top comments (8)

Collapse
 
qm3ster profile image
Mihail Malo

Doesn't seem like the output of JSON.stringify(protein, null, "I 💛") is recoverable with JSON.parse.

Collapse
 
samanthaming profile image
Samantha Ming

oh ya 😮 ...looking into the docs. it seems like:
Throws a SyntaxError exception if the string to parse is not valid JSON.

Definitely something to keep in mind before using the "space" parameter. thanks for catching that!

Collapse
 
qm3ster profile image
Mihail Malo • Edited

I was just curious if there would be a way to recover, for example another parameter you could pass to parse. There isn't though.

const protein = {
  steak: "🥩",
  bacon: "🥓",
  fake: { shrimp: "🍤" },
  array: ["🥩", "🥓", "🍤"]
}
// looks weird but works
JSON.parse(JSON.stringify(protein, null, "\n\t\n\0\r  "))
// SyntaxError
JSON.parse(JSON.stringify(protein, null, "🥓"))

// and my favorite:
// parses as `{sh: "🍤", steak: "🥩", bacon: "🥓"}`
// but breaks nested objects or arrays.
JSON.parse(JSON.stringify({ steak: "🥩", bacon: "🥓" }, null, '"sh":"🍤",'))
Collapse
 
papagoat profile image
Terence Lucas Yap

This is awesome. Never really bothered to discover all these features. Thumbs up. :)

Collapse
 
samanthaming profile image
Samantha Ming

You're welcome! Glad you found it helpful 👍

Collapse
 
thompcd profile image
Corey Thompson

Thank you! Saved me quite a bit of searching :)

Collapse
 
samanthaming profile image
Samantha Ming

Glad the tidbit was helpful! Thanks for reading the article 😄

Collapse
 
samanthaming profile image
Samantha Ming

Thanks! 😄