Python 101: An Intro to Working with JSON

JavaScript Object Notation, more commonly known as JSON, is a lightweight data interchange format inspired by JavaScript object literal syntax. JSON is easy for humans to read and write. It is also easy for computers to parse and generate. JSON is used for storing and exchanging data in much the same way that XML is used.

Python has a built-in library called json that you can use for creating, editing and parsing JSON. You can read all about this library here:

It would probably be helpful to know what JSON looks like. Here is an example of JSON from https://json.org:

{"menu": {
  "id": "file",
  "value": "File",
  "popup": {
    "menuitem": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]
  }
}}

From Python’s point of view, this JSON is a nested Python dictionary. You will find that JSON is always translated into some kind of native Python data type. In this article, you will learn about the following:

  • Encoding a JSON String
  • Decoding a JSON String
  • Saving JSON to Disk
  • Loading JSON from Disk
  • Validating JSON with json.tool

JSON is a very popular format that is often used in web applications. You will find that knowing how to interact with JSON using Python is useful in your own work.

Let’s get started!

Encoding a JSON String

Python’s json module uses dumps() to serialize an object to a string. The “s” in dumps() stands for “string”. It’s easier to see how this works by using the json module in some code:

>>> import json
>>> j = {"menu": {
...   "id": "file",
...   "value": "File",
...   "popup": {
...     "menuitem": [
...       {"value": "New", "onclick": "CreateNewDoc()"},
...       {"value": "Open", "onclick": "OpenDoc()"},
...       {"value": "Close", "onclick": "CloseDoc()"}
...     ]
...   }
... }}
>>> json.dumps(j)
'{"menu": {"id": "file", "value": "File", "popup": {"menuitem": [{"value": "New", '
'"onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, '
'{"value": "Close", "onclick": "CloseDoc()"}]}}}'

Here you use json.dumps(), which transforms the Python dictionary into a JSON string. The example’s output was modified to wrap the string for print. Otherwise the string would all be on one line.

Now you’re ready to learn how to write an object to disk!

Saving JSON to Disk

Python’s json module uses the dump() function to serialize or encode an object as a JSON formatted stream to a file-like object. File-like objects in Python are things like file handlers or objects that you create using Python’s io module.

Go ahead and create a file named create_json_file.py and add the following code to it:

# create_json_file.py

import json

def create_json_file(path, obj):
    with open(path, 'w') as fh:
        json.dump(obj, fh)

if __name__ == '__main__':
    j = {"menu": {
        "id": "file",
        "value": "File",
        "popup": {
          "menuitem": [
            {"value": "New", "onclick": "CreateNewDoc()"},
            {"value": "Open", "onclick": "OpenDoc()"},
            {"value": "Close", "onclick": "CloseDoc()"}
          ]
        }
      }}
    create_json_file('test.json', j)

In this example, you use json.dump(), which is for writing to a file or file-like object. It will write to the file-handler, fh.

Now you can learn about decoding a JSON string!

Decoding a JSON String

Decoding or deserializing a JSON string is done via the loads() method. loads() is the companion function to dumps(). Here is an example of its use:

>>> import json
>>> j_str = """{"menu": {
...   "id": "file",
...   "value": "File",
...   "popup": {
...     "menuitem": [
...       {"value": "New", "onclick": "CreateNewDoc()"},
...       {"value": "Open", "onclick": "OpenDoc()"},
...       {"value": "Close", "onclick": "CloseDoc()"}
...     ]
...   }
... }}
... """
>>> j_obj = json.loads(j_str)
>>> type(j_obj)
<class 'dict'>

Here you recreate the JSON code from earlier as a Python multi-line string. Then you load the JSON string using json.loads(), which converts it to a Python object. In this case, it converts the JSON to a Python dictionary.

Now you are ready to learn how to load JSON from a file!

Loading JSON from Disk

Loading JSON from a file is done using json.load(). Here is an example:

# load_json_file.py

import json

def load_json_file(path):
    with open(path) as fh:
        j_obj = json.load(fh)
    print(type(j_obj))


if __name__ == '__main__':
    load_json_file('example.json')

In this code, you open the passed in file as you have seen before. Then you pass the file-handler, fh, to json.load(), which will transform the JSON into a Python object.

You can also use Python’s json module to validate JSON. You will find out how to do that next.

Validating JSON with json.tool

Python’s json module provides a tool you can run on the command line to check and see if the JSON has the correct syntax. Here are a couple of examples:

$ echo '{1.2:3.4}' | python -m json.tool
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
$ echo '{"1.2":3.4}' | python -m json.tool
{
    "1.2": 3.4
}

The first call passes the string, '{1.2:3.4}' to json.tool, which tells you that there is something wrong with the JSON code. The second example shows you how to the fix the issue. When the fixed string is passed in to json.tool, it will “pretty-print” the JSON back out instead of emitting an error.

Wrapping Up

The JSON format is used very often when working with web APIs and web frameworks. The Python language provides a nice tool for you to use to convert JSON to Python objects and back again in the json library.

In this chapter, you learned about the following:

  • Encoding a JSON String
  • Decoding a JSON String
  • Saving JSON to Disk
  • Loading JSON from Disk
  • Validating JSON with json.tool

You now have another useful tool that you can use Python for. With a little practice, you will be working with JSON in no time!