summary refs log tree commit diff
path: root/synapse/util/__init__.py
diff options
context:
space:
mode:
authorRichard van der Hoff <richard@matrix.org>2020-10-28 15:51:15 +0000
committerRichard van der Hoff <richard@matrix.org>2020-10-28 15:56:57 +0000
commitb6ca69e4f109c745f022885ecb8aa86255f84ecf (patch)
treeb7f9753346ab10425f93f9d77ebe937d112a6d57 /synapse/util/__init__.py
parent1.22.0 (diff)
downloadsynapse-b6ca69e4f109c745f022885ecb8aa86255f84ecf.tar.xz
Remove frozendict_json_encoder and support frozendicts everywhere
Not being able to serialise `frozendicts` is fragile, and it's annoying to have
to think about which serialiser you want. There's no real downside to
supporting frozendicts, so let's just have one json encoder.
Diffstat (limited to 'synapse/util/__init__.py')
-rw-r--r--synapse/util/__init__.py24
1 files changed, 21 insertions, 3 deletions
diff --git a/synapse/util/__init__.py b/synapse/util/__init__.py

index d55b93d763..517686f0a6 100644 --- a/synapse/util/__init__.py +++ b/synapse/util/__init__.py
@@ -18,6 +18,7 @@ import logging import re import attr +from frozendict import frozendict from twisted.internet import defer, task @@ -31,9 +32,26 @@ def _reject_invalid_json(val): raise ValueError("Invalid JSON value: '%s'" % val) -# Create a custom encoder to reduce the whitespace produced by JSON encoding and -# ensure that valid JSON is produced. -json_encoder = json.JSONEncoder(allow_nan=False, separators=(",", ":")) +def _handle_frozendict(obj): + """Helper for json_encoder. Makes frozendicts serializable by returning + the underlying dict + """ + if type(obj) is frozendict: + # fishing the protected dict out of the object is a bit nasty, + # but we don't really want the overhead of copying the dict. + return obj._dict + raise TypeError( + "Object of type %s is not JSON serializable" % obj.__class__.__name__ + ) + + +# A custom JSON encoder which: +# * handles frozendicts +# * produces valid JSON (no NaNs etc) +# * reduces redundant whitespace +json_encoder = json.JSONEncoder( + allow_nan=False, separators=(",", ":"), default=_handle_frozendict +) # Create a custom decoder to reject Python extensions to JSON. json_decoder = json.JSONDecoder(parse_constant=_reject_invalid_json)