Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django Rest Framework Response is not JSON serializable error

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?

like image 347
Kakaji Avatar asked May 12 '17 07:05

Kakaji


2 Answers

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)
like image 87
Sardorbek Imomaliev Avatar answered Oct 07 '22 00:10

Sardorbek Imomaliev


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
    ...
like image 43
Ozgur Vatansever Avatar answered Oct 06 '22 23:10

Ozgur Vatansever