aboutsummaryrefslogtreecommitdiff
path: root/gn3/json_encoders_decoders.py
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2023-04-18 13:57:49 +0300
committerFrederick Muriuki Muriithi2023-04-18 14:10:47 +0300
commit0958648c62452a53d0f66d7401261015e39d2fb8 (patch)
treeeaca4e23b40ab116875378ca1a7965a78a26dac3 /gn3/json_encoders_decoders.py
parent03bbc359b84c000baaf20415ff3ad1f9acca2817 (diff)
downloadgenenetwork3-0958648c62452a53d0f66d7401261015e39d2fb8.tar.gz
auth: Consistently JSON encode values.
Consistently encode all values for the top-level keys stored in redis to avoid issues with json encode/decode
Diffstat (limited to 'gn3/json_encoders_decoders.py')
-rw-r--r--gn3/json_encoders_decoders.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/gn3/json_encoders_decoders.py b/gn3/json_encoders_decoders.py
new file mode 100644
index 0000000..be15b34
--- /dev/null
+++ b/gn3/json_encoders_decoders.py
@@ -0,0 +1,31 @@
+"""Custom json encoders for various purposes."""
+import json
+from uuid import UUID
+from datetime import datetime
+
+__ENCODERS__ = {
+ UUID: lambda obj: {"__type": "UUID", "__value": str(obj)},
+ datetime: lambda obj: {"__type": "DATETIME", "__value": obj.isoformat()}
+}
+
+class CustomJSONEncoder(json.JSONEncoder):
+ """
+ A custom JSON encoder to handle cases where the default encoder fails.
+ """
+ def default(self, obj):# pylint: disable=[arguments-renamed]
+ """Return a serializable object for `obj`."""
+ if type(obj) in __ENCODERS__:
+ return __ENCODERS__[type(obj)](obj)
+ return json.JSONEncoder.default(self, obj)
+
+
+__DECODERS__ = {
+ "UUID": UUID,
+ "DATETIME": datetime.fromisoformat
+}
+
+def custom_json_decoder(obj_dict):
+ """Decode custom types"""
+ if "__type" in obj_dict:
+ return __DECODERS__[obj_dict["__type"]](obj_dict["__value"])
+ return obj_dict