JSON.stringify accepts 2 other parameters

Cover image

Do you know that JSON.stringify can actually take 2 other parameters? I didn't know this before I laid my eyes on my colleage's pull request.(I'm such a noob) But it's nothing difficult. Those 2 parameters will help optimize the result in a good format.

In my opinion, the usage of JSON.stringify parameters is never a rare case. Well, let's take a look at those "I-didn't-know" features that "educated" me.

1. Replacer: Filtering your properties

This parameter is of course optional by default. By assigning Array of Number or String, the output JSON will return the stringified properties given in the Array.

const obj = {
  "site": "Pitayan",
  "url": "https://pitayan.com",
  100: 100
}

JSON.stringify(obj, ['site', 100])
// "{\"site\":\"Pitayan\",\"100\":100}"

This is extremely helpful when I only some of the properties inside the Object.

But it comes to negations, the 2nd parameter will not provide any help. Well, I suppose this is how this API is designed initially. In such case, it's better to handle the Object properties before JSON.stringify.

2. Space: Formatting the string JSON

JSON.stringify offers another useful parameter which allows use to format the string output with whitespaces.

Frankly speaking, I don't quite need it, since I could print out the Object in the browser console directly. But it is truely helpful when the JSON data is big enough, and I'm printing out data in the terminal.

// Without formatter
JSON.stringify(obj)
// "{\"site\":\"Pitayan\","url\":\"https://pitayan.com\",\"100\":100}"

This looks prettier, isn't it?

// With formatter
JSON.stringify(obj, null, 2)
// "{
//   \"100\": 100,
//   \"site\": \"Pitayan\",
//   \"url\": \"https://pitayan.com\"
// }"

3. toJSON

After I realised that there are 2 parameters for JSON.stringify, I decided to take a look at the official document. Then I found that an Object can define a method to control the behavior of JSON.stringify.

It's intercepting the stringify process and a proper String value must be returned from toJSON method. Otherwise, the output is undefined.

toJSON receives an argument which is the key of the target Object if it's nested within another one.

const objToJSON = {
  "site": "pitayan",
  "url": "https://pitayan.com",
  toJSON: function (key) {
    if (key) {
      return `[${key}]: ${this.site} -- ${this.url}`
    } else {
      return `${this.site} -- ${this.url}`
    }
  }
}


JSON.stringify(objToJSON)
// "\"pitayan -- https://pitayan.com\""

JSON.stringify({ objToJSON })
// "{\"objToJSON\":\"[objToJSON]: pitayan -- https://pitayan.com\"}"

Okay, this is all for JSON.stringify. Hope this article will help everyone gain some knowledge about this usefull API.

If you think this article is great, please do share it on the social network. Thanks for reading!

References