We recently released a JSON-focused edition of the Dev Digest, honouring its creator, Douglas Crockford, and what has become one of the most commonly used formats for storing and sharing data. It turns out, developers really like JSON, so we thought we would share some of our favourite tips and tricks for working with it.

Before we get started, you can find the video-version of this article on our Watch page, and find all of the code included in this article in the GitHub repo.

Safe Parsing

__wf_reserved_inherit
Parsing data inside of a try/catch block

To kick things off, let's look at a simple way to safely parse JSON. We start by wrapping our JSON.parse in a try/catch block to gracefully handle any pesky errors. Of course, we could forego this if we're absolutely certain the data is valid JSON, but it's better to be safe than sorry, right? So, let's wrap it in the try/catch, and then we can easily log errors to the console, if any arise.

Validation

__wf_reserved_inherit
isValidJSON function, returning a boolean

Next, let's take this a step further. Let's create a simple function to check whether JSON is valid; you'll notice it contains our try/catch block, and returns a boolean confirming whether or not the JSON is valid.

This function helps ensure you're only working with legitimate JSON data, and again, makes it easy to find and understand errors if they occur.

Pretty Printing

__wf_reserved_inherit
Pretty print using the third parameter of JSON.stringify

Beautifying your JSON isn't just about making it look pretty - it makes it readable too. To handle this, all you need to do is pass a number to the third parameter of the stringify method (pertaining the number of 'spaces' an indentation is made up of).

The Replacer

__wf_reserved_inherit
Exclude fields using the replacer function of JSON.stringify

Excluding sensitive data like emails or passwords? Selectively omit fields using the replacer function, which is the second parameter of JSON.stringify.

The Reviver

__wf_reserved_inherit
Transform data as you parse it using the reviver

The reviver works similarly, but with a key difference: the reviver allows you to transform the data at the same as parsing it. In this example, you see that I transform 'date' strings into date objects with a simple function passed in to the second parameter of JSON.parse. In this example, I target a specific object within my JSON array, targeting the date object to check it has in fact been converted to a date.

Deep Cloning

__wf_reserved_inherit
Deep cloning using stringify and parse

In order to avoid unexpected changes to your data, you can deep clone your JSON in order to manipulate the cloned object rather than the original. To do this, we use a simple trick where we we stringify our JSON, only to parse it once again (creating a completely new object).

In the example, we update one of the values of this new object before console.logging the values of the original object as well as the new one. This shows that we can update the cloned object while leaving the original unaffected.

Creating Query Strings

__wf_reserved_inherit
Creating a query string from JSON

Transform your JSON data into a query string, making it easier to pass to the server or use elsewhere in your application, with a simple function. For this step, I use a simple JSON object containing a name, age and city for a fictional person.

Inside the function, we use Object.keys(params) to get an array of all the keys in the object. In this example, this returns ["name", "age", "city"].

We use .map() to go through each key and build a key-value pair string. During this step, the key and its corresponding value are both URL-encoded using encodeURIComponent(). This ensures that special characters like spaces are safe for URLs.

The array of key-value pairs is then combined into a single string using .join('&'). This joins each element with an '&' symbol, forming a proper query string that is ready to use!

Dynamic JSON Creation

__wf_reserved_inherit
Dynamically creating JSON from two arrays

Sometimes you might receive data in separate locations, and need to use these data sources as JSON. To do this, we're going to create a function called generateJSON.

The generateJSON function takes two arrays, one for keys and one for values. It initializes an empty object called result. Then, it uses forEach() to loop through the keys array, assigning each key a value from the values array using the same index. The result is an object where each key from the keys array is paired with its corresponding value from the values array. Finally, the function returns this object.

Merging Objects

__wf_reserved_inherit
Shallow merging two objects

Like some of the others tips in this article, this one is not exclusive to JSON, but it's certainly useful for when you're working with it.

Merge JSON objects smoothly using the spread operator (shown below):

Here you'll notice that old data will be overwritten by new data, if any of the keys match.

Extracting Data

__wf_reserved_inherit
Extracting data using theflapMap method

This one is a personal favourite of mine. The flapMap method essentially combines the map method with the flap method, returning a new array formed by applying a given callback function to each element of the array, and then flattening the result by one level.

The benefit of this method is that we can avoid iterating over nested arrays, making code that is difficult to read and decipher. Instead, we can just apply the flatMap method to our JSON object, targeting the nested array we want to extract from, and voil !

Conclusion

We hope you found this article useful (or video if you watched along), and that you've picked up a few new ways of working with JSON that you can take advantage of in your own projects or at work.

You can, of course, find the code for this project on this GitHub repo, and you can submit a pull request if you would like to add your own.

Until next time... happy coding!

See all articles
Newest jobs
SCRUM MASTER / TEAM COACH (M/W/D)
Wilken GmbH
·
today
Ulm, Germany
+1
Hybrid
SENIOR DEVELOPER (M/W/D)
Wilken GmbH
·
today
Ulm, Germany
+1
Hybrid
JAVA SOFTWARE DEVELOPER (M/W/D)
Wilken GmbH
·
today
Ulm, Germany
Hybrid
Full Stack Developer (m/f/x)
Innerspace - The Simulator Company
·
yesterday
Innsbruck, Austria
Hybrid