How to make a class JSON serializable

Matheus Mello
Matheus Mello
September 2, 2023
Cover Image for How to make a class JSON serializable

Making a Class JSON Serializable 🌟

So, you've encountered the dreaded TypeError: Object of type 'FileItem' is not JSON serializable when trying to serialize a Python class to JSON. Don't worry, we've all been there! 🤷‍♀️

Serializing a class to JSON means converting its object into a JSON string, which is useful for transferring data between different systems or storing it in a file. However, not all Python classes are JSON serializable by default, as they may contain non-serializable attributes or complex data types.

But fear not, my fellow Pythonistas! In this guide, I will show you some easy solutions to make your class JSON serializable.

The Problem 🧐

Let's start with an example class called FileItem:

class FileItem:
    def __init__(self, fname):
        self.fname = fname

Now, imagine you have an instance of this class and you want to serialize it to JSON using the json.dumps() function:

import json

x = FileItem('/foo/bar')
json.dumps(x)

At this point, you will be met with the frustrating TypeError: Object of type 'FileItem' is not JSON serializable. 😞

The reason for this error is that the json library doesn't know how to handle custom classes by default. Luckily, there are a few ways to overcome this obstacle and make our class JSON serializable.

Solution 1: Implementing the __dict__ Method 📝

One simple way to make a class JSON serializable is to define the __dict__ method. This method returns a dictionary representation of the class instance, which can be easily serialized to JSON.

Here's how to implement this method in our FileItem class:

class FileItem:
    def __init__(self, fname):
        self.fname = fname
    
    def __dict__(self):
        return self.__dict__

Now, if we try to serialize an instance of FileItem to JSON, it should work like a charm:

x = FileItem('/foo/bar')
json.dumps(x)

No more TypeError! 🎉

Solution 2: Implementing the json.JSONEncoder Class 🎚

Another approach is to create a custom JSON encoder by inheriting from the json.JSONEncoder class. This allows us to define how our class should be serialized to JSON.

Here's an example:

import json

class FileItemEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, FileItem):
            return obj.__dict__
        return super().default(obj)

x = FileItem('/foo/bar')
json.dumps(x, cls=FileItemEncoder)

By overriding the default() method of json.JSONEncoder, we check if the object is an instance of FileItem. If it is, we return its __dict__, which is then serializable to JSON.

Solution 3: Using the dataclasses Module 💡

Starting from Python 3.7, we have the dataclasses module, which provides a decorator to automatically generate special methods for classes. One of these methods is the asdict() method, which returns a dictionary representation of the class.

To make our FileItem class serializable, we can leverage the dataclasses module:

from dataclasses import dataclass, asdict

@dataclass
class FileItem:
    fname: str

x = FileItem('/foo/bar')
json.dumps(asdict(x))

The dataclass decorator adds the necessary methods behind the scenes, including the asdict() method, which we can use to convert our instance to a dictionary and then serialize it to JSON.

Conclusion and Call-to-Action 🎉

Congratulations! You have learned how to make a Python class JSON serializable. We covered three different solutions:

  1. Implementing the __dict__ method: Ideal when you want a simple and quick solution.

  2. Implementing the json.JSONEncoder class: Useful when you want more control over the serialization process.

  3. Using the dataclasses module: Great for automatically generating serialization methods.

Now it's time for you to put this knowledge into practice! Try serializing your own custom classes and see the magic happen. ✨

If you found this guide helpful, share it with your fellow Python enthusiasts and let them also become JSON serialization masters! 🚀

Have any questions or additional tips to share? Let me know in the comments below. Together, we can conquer any serialization challenge! 💪

Happy coding! 😄🐍

Take Your Tech Career to the Next Level

Our application tracking tool helps you manage your job search effectively. Stay organized, track your progress, and land your dream tech job faster.

Your Product
Product promotion

Share this article

More Articles You Might Like

Latest Articles

Cover Image for How can I echo a newline in a batch file?
batch-filenewlinewindows

How can I echo a newline in a batch file?

Published on March 20, 2060

🔥 💻 🆒 Title: "Getting a Fresh Start: How to Echo a Newline in a Batch File" Introduction: Hey there, tech enthusiasts! Have you ever found yourself in a sticky situation with your batch file output? We've got your back! In this exciting blog post, we

Cover Image for How do I run Redis on Windows?
rediswindows

How do I run Redis on Windows?

Published on March 19, 2060

# Running Redis on Windows: Easy Solutions for Redis Enthusiasts! 🚀 Redis is a powerful and popular in-memory data structure store that offers blazing-fast performance and versatility. However, if you're a Windows user, you might have stumbled upon the c

Cover Image for Best way to strip punctuation from a string
punctuationpythonstring

Best way to strip punctuation from a string

Published on November 1, 2057

# The Art of Stripping Punctuation: Simplifying Your Strings 💥✂️ Are you tired of dealing with pesky punctuation marks that cause chaos in your strings? Have no fear, for we have a solution that will strip those buggers away and leave your texts clean an

Cover Image for Purge or recreate a Ruby on Rails database
rakeruby-on-railsruby-on-rails-3

Purge or recreate a Ruby on Rails database

Published on November 27, 2032

# Purge or Recreate a Ruby on Rails Database: A Simple Guide 🚀 So, you have a Ruby on Rails database that's full of data, and you're now considering deleting everything and starting from scratch. Should you purge the database or recreate it? 🤔 Well, my