From d56029549acae0b0ea94c5a0f783e3b3895d9218 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Fri, 1 May 2020 13:45:39 -0700 Subject: [PATCH] Serialize JSON with non-JSON values, closes #102 --- sqlite_utils/db.py | 6 ++++-- tests/test_create.py | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/sqlite_utils/db.py b/sqlite_utils/db.py index 9e3987e..dd49d5c 100644 --- a/sqlite_utils/db.py +++ b/sqlite_utils/db.py @@ -1317,7 +1317,7 @@ def chunks(sequence, size): def jsonify_if_needed(value): if isinstance(value, (dict, list, tuple)): - return json.dumps(value) + return json.dumps(value, default=repr) elif isinstance(value, (datetime.time, datetime.date, datetime.datetime)): return value.isoformat() else: @@ -1326,7 +1326,9 @@ def jsonify_if_needed(value): def _hash(record): return hashlib.sha1( - json.dumps(record, separators=(",", ":"), sort_keys=True).encode("utf8") + json.dumps(record, separators=(",", ":"), sort_keys=True, default=repr).encode( + "utf8" + ) ).hexdigest() diff --git a/tests/test_create.py b/tests/test_create.py index 95b64ab..5290cd8 100644 --- a/tests/test_create.py +++ b/tests/test_create.py @@ -847,3 +847,9 @@ def test_create_with_a_null_column(fresh_db): record = {"name": "Name", "description": None} fresh_db["t"].insert(record) assert [record] == list(fresh_db["t"].rows) + + +def test_create_with_nested_bytes(fresh_db): + record = {"id": 1, "data": {"foo": b"bytes"}} + fresh_db["t"].insert(record) + assert [{"id": 1, "data": '{"foo": "b\'bytes\'"}'}] == list(fresh_db["t"].rows)