From dcb128eb8ba92f78c7046050a795b3ef3d8fcb4e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 16 Mar 2019 14:06:15 +0530 Subject: [PATCH] py3: Allow serializing utf-8 bytestrings to JSON This matches behavior of py2 --- src/calibre/utils/config.py | 2 ++ src/calibre/utils/serialize.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/calibre/utils/config.py b/src/calibre/utils/config.py index 22934c9b27..8162af7baa 100644 --- a/src/calibre/utils/config.py +++ b/src/calibre/utils/config.py @@ -203,6 +203,8 @@ def to_json(obj): '__value__': isoformat(obj, as_utc=True)} if isinstance(obj, (set, frozenset)): return {'__class__': 'set', '__value__': tuple(obj)} + if isinstance(obj, bytes): + return obj.decode('utf-8') if hasattr(obj, 'toBase64'): # QByteArray return {'__class__': 'bytearray', '__value__': bytes(obj.toBase64()).decode('ascii')} diff --git a/src/calibre/utils/serialize.py b/src/calibre/utils/serialize.py index 2b8bd1e7cc..cd5cd28a1b 100644 --- a/src/calibre/utils/serialize.py +++ b/src/calibre/utils/serialize.py @@ -43,6 +43,8 @@ def create_encoder(for_json=False): return encoded(3, fm_as_dict(obj), ExtType) elif isinstance(obj, Tag): return encoded(4, obj.as_dict(), ExtType) + if for_json and isinstance(obj, bytes): + return obj.decode('utf-8') raise TypeError('Cannot serialize objects of type {}'.format(type(obj))) return encoder