Django RESTフレームワークに次のカスタム例外ハンドラーがあります。
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)
以下に示すようなJSON出力が必要です
"success":false,
"data":{ "message" : "Validation error" }
しかし、エラーが発生しますTypeError: Object of type 'ErrorMessage' is not JSON serializable
。上記のErrorMessage
のように単純なクラスがJSONシリアル化できないのはなぜですか?どうすればこの問題を解決できますか?
object
であるため、シリアル化できません。dict
、list
、またはプレーンな値である必要があります。ただし、マジックプロパティ__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)
より一般的な方法は、エラーメッセージオブジェクトをシリアル化するためのシリアライザーを作成することだと思います。
from rest_framework import serializers
class ErrorMessageSerializer(serializers.Serializer):
message = serializers.CharField(max_length=256)
次に、次のことができます。
def insta_exception_handler(exc, context):
...
serializer = ErrorMessageSerializer(ErrorMessage("Validation error"))
response["data"] = serializer.data
...