Trying to serialize a dict containing datetime objects as keys to json. A few other answers have suggested using the json.dump parameters default or cls however, neither of these methods appear to be even called. See MWEs below. What am I missing?
Using Default
from datetime import datetime
import json
def default(obj):
print("Default Called")
if isinstance(obj, (datetime, date)):
return obj.isoformat()
test = {datetime(1970, 1, 1, 8, 0, 0): 10}
with open("output.json", "w") as fo:
json.dump(test, fo, default=default)
Traceback (most recent call last):
File "test.py", line 21, in <module>
json.dump(test, fo, default=default)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/__init__.py", line 179, in dump
for chunk in iterable:
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/encoder.py", line 431, in _iterencode
yield from _iterencode_dict(o, _current_indent_level)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/encoder.py", line 376, in _iterencode_dict
raise TypeError(f'keys must be str, int, float, bool or None, '
TypeError: keys must be str, int, float, bool or None, not datetime
Using cls
from datetime import datetime
import json
class DateEncoder(json.JSONEncoder):
def default(self, obj):
print("Default called")
if isinstance(obj, (datetime, date)):
return obj.isoformat()
# Let the base class default method raise the TypeError
return json.JSONEncoder.default(self, obj)
test = {datetime(1970, 1, 1, 8, 0, 0): 10}
with open("output.json", "w") as fo:
json.dump(test, fo, cls=DateEncoder)
Traceback (most recent call last):
File "test.py", line 16, in <module>
json.dump(test, fo, cls=DateEncoder)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/__init__.py", line 179, in dump
for chunk in iterable:
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/encoder.py", line 431, in _iterencode
yield from _iterencode_dict(o, _current_indent_level)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/encoder.py", line 376, in _iterencode_dict
raise TypeError(f'keys must be str, int, float, bool or None, '
TypeError: keys must be str, int, float, bool or None, not datetime