diff --git a/oslo_serialization/jsonutils.py b/oslo_serialization/jsonutils.py index cbffc90..055d8c8 100644 --- a/oslo_serialization/jsonutils.py +++ b/oslo_serialization/jsonutils.py @@ -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: diff --git a/tests/test_jsonutils.py b/tests/test_jsonutils.py index 5ab465c..34f0616 100644 --- a/tests/test_jsonutils.py +++ b/tests/test_jsonutils.py @@ -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)