jsonutils: support UUID encoding

Change-Id: I2c864f793b4ee6136442b678380bf21f732be643
This commit is contained in:
Julien Danjou 2015-01-14 16:13:28 +01:00
parent 2c244b288e
commit 73f7155af2
2 changed files with 15 additions and 0 deletions

View File

@ -37,6 +37,7 @@ import functools
import inspect
import itertools
import sys
import uuid
is_simplejson = False
if sys.version_info < (2, 7):
@ -111,6 +112,9 @@ def to_primitive(value, convert_instances=False, convert_datetime=True,
else:
return value
if isinstance(value, uuid.UUID):
return six.text_type(value)
# value of itertools.count doesn't get caught by nasty_type_tests
# and results in infinite loop when list(value) is called.
if type(value) == itertools.count:

View File

@ -16,6 +16,7 @@
import collections
import datetime
import json
import uuid
import mock
import netaddr
@ -68,6 +69,11 @@ class JSONUtilsTestMixin(object):
self.assertEqual(expected, fp.getvalue())
def test_dumps_uuid(self):
self.assertEqual('"87edfaf4-9bff-11e4-82bd-b7b4e88d3780"',
jsonutils.dumps(
uuid.UUID("87edfaf49bff11e482bdb7b4e88d3780")))
def test_loads(self):
self.assertEqual({'a': 'b'}, jsonutils.loads('{"a": "b"}'))
@ -135,6 +141,11 @@ class ToPrimitiveTestCase(test_base.BaseTestCase):
self.assertEqual(jsonutils.to_primitive(x),
'1920-02-03T04:05:06.000007')
def test_uuid(self):
x = uuid.uuid4()
self.assertEqual(jsonutils.to_primitive(x),
six.text_type(x))
def test_datetime_preserve(self):
x = datetime.datetime(1920, 2, 3, 4, 5, 6, 7)
self.assertEqual(jsonutils.to_primitive(x, convert_datetime=False), x)