mirror of https://github.com/django/django.git
Fixed #25019 -- Added UUID support in DjangoJSONEncoder
This commit is contained in:
parent
c078021555
commit
6355a6d4f5
|
@ -8,6 +8,7 @@ from __future__ import absolute_import, unicode_literals
|
||||||
import datetime
|
import datetime
|
||||||
import decimal
|
import decimal
|
||||||
import json
|
import json
|
||||||
|
import uuid
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from django.core.serializers.base import DeserializationError
|
from django.core.serializers.base import DeserializationError
|
||||||
|
@ -86,7 +87,7 @@ def Deserializer(stream_or_string, **options):
|
||||||
|
|
||||||
class DjangoJSONEncoder(json.JSONEncoder):
|
class DjangoJSONEncoder(json.JSONEncoder):
|
||||||
"""
|
"""
|
||||||
JSONEncoder subclass that knows how to encode date/time and decimal types.
|
JSONEncoder subclass that knows how to encode date/time, decimal types and UUIDs.
|
||||||
"""
|
"""
|
||||||
def default(self, o):
|
def default(self, o):
|
||||||
# See "Date Time String Format" in the ECMA-262 specification.
|
# See "Date Time String Format" in the ECMA-262 specification.
|
||||||
|
@ -108,6 +109,8 @@ class DjangoJSONEncoder(json.JSONEncoder):
|
||||||
return r
|
return r
|
||||||
elif isinstance(o, decimal.Decimal):
|
elif isinstance(o, decimal.Decimal):
|
||||||
return str(o)
|
return str(o)
|
||||||
|
elif isinstance(o, uuid.UUID):
|
||||||
|
return str(o)
|
||||||
else:
|
else:
|
||||||
return super(DjangoJSONEncoder, self).default(o)
|
return super(DjangoJSONEncoder, self).default(o)
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ import json
|
||||||
import os
|
import os
|
||||||
import pickle
|
import pickle
|
||||||
import unittest
|
import unittest
|
||||||
|
import uuid
|
||||||
|
|
||||||
from django.core.exceptions import SuspiciousOperation
|
from django.core.exceptions import SuspiciousOperation
|
||||||
from django.core.serializers.json import DjangoJSONEncoder
|
from django.core.serializers.json import DjangoJSONEncoder
|
||||||
|
@ -480,6 +481,11 @@ class JsonResponseTests(SimpleTestCase):
|
||||||
response = JsonResponse(['foo', 'bar'], safe=False)
|
response = JsonResponse(['foo', 'bar'], safe=False)
|
||||||
self.assertEqual(json.loads(response.content.decode()), ['foo', 'bar'])
|
self.assertEqual(json.loads(response.content.decode()), ['foo', 'bar'])
|
||||||
|
|
||||||
|
def test_json_response_uuid(self):
|
||||||
|
u = uuid.uuid4()
|
||||||
|
response = JsonResponse(u, safe=False)
|
||||||
|
self.assertEqual(json.loads(response.content.decode()), str(u))
|
||||||
|
|
||||||
def test_json_response_custom_encoder(self):
|
def test_json_response_custom_encoder(self):
|
||||||
class CustomDjangoJSONEncoder(DjangoJSONEncoder):
|
class CustomDjangoJSONEncoder(DjangoJSONEncoder):
|
||||||
def encode(self, o):
|
def encode(self, o):
|
||||||
|
|
Loading…
Reference in New Issue