From d182ba82838c3dce6113d6c9b106981cff4ec1ce Mon Sep 17 00:00:00 2001 From: Itamar Turner-Trauring Date: Tue, 23 Mar 2021 10:53:10 -0400 Subject: [PATCH] Utility to dump JSON to bytes. --- src/allmydata/test/test_util.py | 8 +++++++- src/allmydata/util/jsonbytes.py | 10 +++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/allmydata/test/test_util.py b/src/allmydata/test/test_util.py index 5f5db82bd..a14adb787 100644 --- a/src/allmydata/test/test_util.py +++ b/src/allmydata/test/test_util.py @@ -507,7 +507,6 @@ class JSONBytes(unittest.TestCase): self.assertEqual(json.loads(encoded), expected) self.assertEqual(jsonbytes.loads(encoded), expected) - def test_encode_unicode(self): """BytesJSONEncoder encodes Unicode string as usual.""" expected = { @@ -515,3 +514,10 @@ class JSONBytes(unittest.TestCase): } encoded = jsonbytes.dumps(expected) self.assertEqual(json.loads(encoded), expected) + + def test_dumps_bytes(self): + """jsonbytes.dumps_bytes always returns bytes.""" + x = {u"def\N{SNOWMAN}\uFF00": 123} + encoded = jsonbytes.dumps_bytes(x) + self.assertIsInstance(encoded, bytes) + self.assertEqual(json.loads(encoded, encoding="utf-8"), x) diff --git a/src/allmydata/util/jsonbytes.py b/src/allmydata/util/jsonbytes.py index 935187d29..c46a932d0 100644 --- a/src/allmydata/util/jsonbytes.py +++ b/src/allmydata/util/jsonbytes.py @@ -9,7 +9,7 @@ from __future__ import absolute_import from __future__ import division from __future__ import print_function -from future.utils import PY2 +from future.utils import PY2, PY3 if PY2: from future.builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, list, object, range, str, max, min # noqa: F401 @@ -51,6 +51,14 @@ def dumps(obj, *args, **kwargs): return json.dumps(obj, cls=BytesJSONEncoder, *args, **kwargs) +def dumps_bytes(obj, *args, **kwargs): + """Encode to JSON, then encode as bytes.""" + result = dumps(obj, *args, **kwargs) + if PY3: + result = result.encode("utf-8") + return result + + # To make this module drop-in compatible with json module: loads = json.loads