kgx
kgx copied to clipboard
Object of type datetime is not JSON serializable
Describe the bug While working through transforms for kg-obo, I noticed that most of the errors I get during owl to JSON transformation are:
TypeError: Object of type datetime is not JSON serializable
and this causes the transform to quit prematurely, leaving what looks like an incomplete transform.
To Reproduce
$ curl https://raw.githubusercontent.com/vaccineontology/VO/master/src/VO_merged.owl > VO_merged.owl
$ kgx transform -i owl -f json -o VO_merged.json VO_merged.owl.txt
Expected behavior
I know the usual way to handle this is to convert the offending datetime value to a string, and I'd be happy with that, but perhaps there's a more interesting solution.
Additional context
kgx 1.5.1
Here's the stack trace:
Traceback (most recent call last):
File "/home/harry/kg-env/bin/kgx", line 8, in <module>
sys.exit(cli())
File "/home/harry/kg-env/lib/python3.8/site-packages/click/core.py", line 829, in __call__
return self.main(*args, **kwargs)
File "/home/harry/kg-env/lib/python3.8/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/home/harry/kg-env/lib/python3.8/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/home/harry/kg-env/lib/python3.8/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/home/harry/kg-env/lib/python3.8/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/home/harry/kg-env/lib/python3.8/site-packages/kgx/cli/__init__.py", line 505, in transform_wrapper
transform(
File "/home/harry/kg-env/lib/python3.8/site-packages/kgx/cli/cli_utils.py", line 585, in transform
transform_source(
File "/home/harry/kg-env/lib/python3.8/site-packages/kgx/cli/cli_utils.py", line 894, in transform_source
transformer.transform(input_args, output_args)
File "/home/harry/kg-env/lib/python3.8/site-packages/kgx/transformer.py", line 267, in transform
self.process(intermediate_source_generator, sink)
File "/home/harry/kg-env/lib/python3.8/site-packages/kgx/transformer.py", line 341, in process
sink.write_node(rec[-1])
File "/home/harry/kg-env/lib/python3.8/site-packages/kgx/sink/json_sink.py", line 65, in write_node
self.NH.write(record)
File "/home/harry/kg-env/lib/python3.8/site-packages/jsonstreams/__init__.py", line 305, in write
self.__inst.write(*args, **kwargs)
File "/home/harry/kg-env/lib/python3.8/site-packages/jsonstreams/__init__.py", line 468, in write
return self._writer.write(value)
File "/home/harry/kg-env/lib/python3.8/site-packages/jsonstreams/__init__.py", line 278, in _pretty_write_comma
self.__pretty_write(value)
File "/home/harry/kg-env/lib/python3.8/site-packages/jsonstreams/__init__.py", line 282, in __pretty_write
items = self.encoder.encode(value).rstrip().split('\n')
File "/usr/lib/python3.8/json/encoder.py", line 201, in encode
chunks = list(chunks)
File "/usr/lib/python3.8/json/encoder.py", line 431, in _iterencode
yield from _iterencode_dict(o, _current_indent_level)
File "/usr/lib/python3.8/json/encoder.py", line 405, in _iterencode_dict
yield from chunks
File "/usr/lib/python3.8/json/encoder.py", line 325, in _iterencode_list
yield from chunks
File "/usr/lib/python3.8/json/encoder.py", line 438, in _iterencode
o = _default(o)
File "/usr/lib/python3.8/json/encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type datetime is not JSON serializable
Hi @caufieldjh - is this still an issue currently? (or did you implement a workaround? - I can not reproduce).
With kgx 1.5.9, if I run essentially the same thing as above from the CLI:
$ curl https://raw.githubusercontent.com/vaccineontology/VO/master/src/VO_merged.owl > VO_merged.owl
$ kgx transform -i owl -f json -o VO_merged.json VO_merged.owl
Then I still see the error:
[KGX][__init__.py][ transform_wrapper] ERROR: kgx.transform error: Object of type datetime is not JSON serializable
and the resulting JSON is prematurely truncated.
I think I implemented a workaround for this in KG-OBO - might have just removed datetimes entirely.