7

I have the following custom exception handler in Django REST framework.

class ErrorMessage:
    def __init__(self, message):
        self.message = message

def insta_exception_handler(exc, context):
    response = {}

    if isinstance(exc, ValidationError):
        response['success'] = False
        response['data'] = ErrorMessage("Validation error")

    return Response(response)

I want a JSON output as shown below

"success":false,
"data":{ "message" : "Validation error" }

But I get the error TypeError: Object of type 'ErrorMessage' is not JSON serializable. Why is a class as simple as ErrorMessage above not JSON serializable? How can I solve this problem?

Kakaji
  • 1,421
  • 2
  • 15
  • 23
  • You are assigning `ErrorMessage` object to `response['data']`. Class objects can't magically change to python dict. Check this link : http://stackoverflow.com/questions/61517/python-dictionary-from-an-objects-fields For converting python class objects to dict. – Sohaib Farooqi May 12 '17 at 07:42

2 Answers2

6

It is not serializable because it is an object, it should be dict, list or plain value. But you can easily fix your problem by using magic property __dict__

def insta_exception_handler(exc, context):
    response = {}

    if isinstance(exc, ValidationError):
        response['success'] = False
        # like this
        response['data'] = ErrorMessage("Validation error").__dict__

    return Response(response)
Sardorbek Imomaliev
  • 14,861
  • 2
  • 51
  • 63
6

I think more generic way would be to create a serializer for serializing the error message object:

from rest_framework import serializers

class ErrorMessageSerializer(serializers.Serializer):
    message = serializers.CharField(max_length=256)

Then you can do:

def insta_exception_handler(exc, context):
    ...
    serializer = ErrorMessageSerializer(ErrorMessage("Validation error"))
    response["data"] = serializer.data
    ...
Ozgur Vatansever
  • 49,246
  • 17
  • 84
  • 119