Python JSON – Custom Class Serialization

Learn to serialize a complex python class (e.g. User) and write serialized JSON data in file by extending JSONEncoder and custom serialization method.

In Python serialize complex object to JSON example, we have following User class. Here, birthdate of type datetime.

class User:
    def __init__(self, id, name, birthdate):
        self.id = id
        self.name = name
        self.birthdate = birthdate

If we don’t use the custom serialization, we will get the error : TypeError: Object of type User is not JSON serializable.

1. Python Custom Serialization using Serializer Method

1.1. Add default Serializer Method

Add a default serializer method to User class itself. This will be invoked by Python while dumping the JSON.

We can write the complete logic to convert the User object to python dictionary object here.

class User:

  def __init__(self, id, name, birthdate):
    self.id = id
    self.name = name
    self.birthdate = birthdate

  def to_dict(u):
    if isinstance(u, User):
      dict = {
        "id": u.id,
        "name": u.name,
        "birthdate": u.birthdate.strftime("%d %b %y")
      }
      return dict
    else:
      type_name = u.__class__.__name__
      raise TypeError("Unexpected type {0}".format(type_name))

1.2. Use ‘default’ attribute on json.dumps()

Next, to use this serializer method, use the default attribute in json.dump() method. It will be automatically called by python while converting the complex object to JSON.

import json
from user import User
import datetime
from UserEncoder import UserEncoder

u = User(1, 'TestUser', datetime.datetime(1991, 1, 6))

# Convert User object to JSON
print(json.dumps(u, default=User.to_dict))

Program output.

{"id": 1, "name": "TestUser", "birthdate": "06 Jan 91"}

2. Python Custom Serialization using JSONEncoder

Another way to add the similar complex object to JSON converter logic – is to extend the JSONEncoder class.

The following UserEncoder class overrides the default method of UserEncoder class and provides the logic to convert the complex class to JSON.

import json
import datetime
from user import User

class UserEncoder(json.JSONEncoder):

    def default(self, u):

        if isinstance(u, User):
            dict = {
                "id": u.id,
                "name": u.name,
                "birthdate": u.birthdate.strftime("%d %b %y")
            }
            return dict
        else:
            type_name = u.__class__.__name__
            raise TypeError("Unexpected type {0}".format(type_name))

1.2. Use ‘cls’ attribute on json.dumps()

To use custom JSONEncoder, use the cls attribute in json.dump() method. It will be automatically called by python while converting the complex object to JSON.

import json
from user import User
import datetime
from UserEncoder import UserEncoder

u = User(1, 'TestUser', datetime.datetime(1991, 1, 6))

# Convert User object to JSON
print(json.dumps(u, cls=UserEncoder))

Program output.

{"id": 1, "name": "TestUser", "birthdate": "06 Jan 91"}

Happy Learning !!

Was this post helpful?

Join 7000+ Awesome Developers

Get the latest updates from industry, awesome resources, blog updates and much more.

* We do not spam !!

Leave a Comment

HowToDoInJava

A blog about Java and related technologies, the best practices, algorithms, and interview questions.