From 0751324fd6d71bea2f1d5de68bb6eea1d7000361 Mon Sep 17 00:00:00 2001 From: Hykilpikonna Date: Fri, 5 Nov 2021 00:15:31 -0400 Subject: [PATCH] [+] Create json encoder that supports dataclasses and datetime --- collect/utils.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/collect/utils.py b/collect/utils.py index 48c0f86..a864399 100644 --- a/collect/utils.py +++ b/collect/utils.py @@ -1,6 +1,8 @@ +import dataclasses +import json import os from dataclasses import dataclass -from datetime import datetime +from datetime import datetime, date import json5 @@ -76,3 +78,28 @@ def debug(msg: object) -> None: :param msg: Message """ print('[DEBUG] ' + str(msg)) + + +class EnhancedJSONEncoder(json.JSONEncoder): + def default(self, o): + + # Support encoding dataclasses + # https://stackoverflow.com/a/51286749/7346633 + if dataclasses.is_dataclass(o): + return dataclasses.asdict(o) + + # Support encoding datetime + if isinstance(o, (datetime, date)): + return o.isoformat() + + return super().default(o) + + +def json_stringify(obj) -> str: + """ + Serialize json string with support for dataclasses and datetime + + :param obj: Objects + :return: Json strings + """ + return json.dumps(obj, indent=1, cls=EnhancedJSONEncoder)