From ec8098b7e2b69e51c1a3196c20d11b253f914926 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Mon, 28 Sep 2015 17:32:36 +0100 Subject: [PATCH] Work around 2.x/3.x json.dumps() return type fuzziness --- rest_framework/fields.py | 6 +++++- tests/test_fields.py | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index a1d99bd88..38db39287 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -1544,7 +1544,11 @@ class JSONField(Field): def to_representation(self, value): if self.binary: - return json.dumps(value) + value = json.dumps(value) + # On python 2.x the return type for json.dumps() is underspecified. + # On python 3.x json.dumps() returns unicode strings. + if isinstance(value, six.text_type): + value = bytes(value.encode('utf-8')) return value diff --git a/tests/test_fields.py b/tests/test_fields.py index 270a0f652..bcd65a1a6 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -1562,7 +1562,7 @@ class TestBinaryJSONField(FieldValues): Values for `JSONField` with binary=True. """ valid_inputs = [ - ('{"a": 1, "3": null, "b": ["some", "list", true, 1.23]}', { + (b'{"a": 1, "3": null, "b": ["some", "list", true, 1.23]}', { 'a': 1, 'b': ['some', 'list', True, 1.23], '3': None @@ -1576,7 +1576,7 @@ class TestBinaryJSONField(FieldValues): 'a': 1, 'b': ['some', 'list', True, 1.23], '3': None - }, '{"a": 1, "3": null, "b": ["some", "list", true, 1.23]}'), + }, b'{"a": 1, "3": null, "b": ["some", "list", true, 1.23]}'), ] field = serializers.JSONField(binary=True)