Skip to Content
Course content

6.3 Working with JSON Files

JSON (JavaScript Object Notation) is a lightweight data interchange format that is easy for humans to read and write, and easy for machines to parse and generate. Python provides the json module to work with JSON data, allowing you to easily parse and create JSON files.

1. Importing the json Module

Before you can use the functions in the json module, you need to import it.

import json

2. Working with JSON in Python

2.1 Reading JSON Data

To read JSON data from a file, use the json.load() function. This converts the JSON data into a Python dictionary or list, depending on the structure of the JSON.

Example: Reading JSON from a File

import json

# Open a JSON file and read its content
with open('data.json', 'r') as file:
    data = json.load(file)  # Parse the JSON data into a Python dictionary or list
    print(data)

The json.load() function parses the JSON data and returns it as a Python dictionary (or list, depending on the structure). If the JSON data is malformed, it raises a JSONDecodeError.

2.2 Writing JSON Data

To write Python data (like a dictionary or list) to a JSON file, use the json.dump() function. This converts the Python data into a JSON string and writes it to the file.

Example: Writing JSON to a File

import json

# Data to write
data = {
    'name': 'John Doe',
    'age': 30,
    'city': 'New York'
}

# Open a JSON file and write the data
with open('output.json', 'w') as file:
    json.dump(data, file, indent=4)  # Convert Python object to JSON and write it to file
  • The indent=4 argument makes the JSON output more readable by adding indentation.

2.3 Converting Python Objects to JSON Strings

If you need to convert a Python object into a JSON string (without writing to a file), use the json.dumps() function. This function returns a string representation of the JSON data.

Example: Converting to a JSON String

import json

# Data to convert
data = {
    'name': 'John Doe',
    'age': 30,
    'city': 'New York'
}

# Convert Python object to JSON string
json_string = json.dumps(data, indent=4)
print(json_string)

The output would look like this:

{
    "name": "John Doe",
    "age": 30,
    "city": "New York"
}

2.4 Converting JSON Strings Back to Python Objects

If you have a JSON string and need to convert it back into a Python object, use the json.loads() function.

Example: Converting JSON String to Python Object

import json

# JSON string
json_string = '{"name": "John Doe", "age": 30, "city": "New York"}'

# Convert JSON string to Python object
data = json.loads(json_string)
print(data)

The output will be a Python dictionary:

{'name': 'John Doe', 'age': 30, 'city': 'New York'}

3. Formatting JSON Data

When working with JSON, you can format the output using various options to make it more readable or compact.

  • Indentation: Adds newlines and spaces to format the JSON, making it easier to read.
  • Sorting keys: You can sort the keys in the JSON object alphabetically.

Example: Formatting JSON Output

import json

# Data to write
data = {
    'name': 'John Doe',
    'age': 30,
    'city': 'New York'
}

# Write JSON to file with sorted keys and indentation
with open('formatted_output.json', 'w') as file:
    json.dump(data, file, indent=4, sort_keys=True)

This will generate a JSON file where the keys are sorted alphabetically.

4. Handling Complex Data Types

JSON can only store basic data types such as strings, numbers, lists, and dictionaries. If you need to store more complex data types like custom Python objects, you must provide a way to serialize and deserialize them.

4.1 Custom Serialization (Using default argument)

You can provide a custom function for serializing non-serializable objects using the default parameter in json.dump() or json.dumps().

Example: Custom Serialization

import json

# Custom object
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# Custom serialization function
def person_serializer(obj):
    if isinstance(obj, Person):
        return {'name': obj.name, 'age': obj.age}
    raise TypeError("Type not serializable")

# Create an object
person = Person('John Doe', 30)

# Write object to JSON file using custom serializer
with open('person.json', 'w') as file:
    json.dump(person, file, default=person_serializer, indent=4)

4.2 Custom Deserialization (Using object_hook argument)

For deserialization, you can use the object_hook argument to provide a custom function for converting JSON back into a Python object.

Example: Custom Deserialization

import json

# Custom deserialization function
def person_decoder(dict):
    if 'name' in dict and 'age' in dict:
        return Person(dict['name'], dict['age'])
    return dict

# Read JSON file and deserialize
with open('person.json', 'r') as file:
    person = json.load(file, object_hook=person_decoder)
    print(person.name, person.age)

5. Summary of Key Functions in the json Module

  • json.load(file): Reads JSON data from a file and converts it to a Python object.
  • json.loads(string): Converts a JSON string to a Python object.
  • json.dump(obj, file): Writes a Python object to a file as JSON.
  • json.dumps(obj): Converts a Python object to a JSON string.
  • indent: Makes the JSON output more readable with indentation.
  • sort_keys: Sorts the keys alphabetically in the JSON output.
  • default: Used to provide custom serialization for complex data types.
  • object_hook: Used for custom deserialization.

6. Use Cases of JSON in Python

  • Data interchange: JSON is widely used for data exchange between a client and a server in web applications (e.g., APIs).
  • Configuration files: Many applications store configuration settings in JSON files.
  • Storing structured data: JSON is an excellent format for storing structured data such as settings, metadata, and logs.

By mastering the json module, you can seamlessly work with JSON data in Python, whether for reading, writing, or processing complex data structures.

Commenting is not enabled on this course.