kgx icon indicating copy to clipboard operation
kgx copied to clipboard

Object of type datetime is not JSON serializable

Open caufieldjh opened this issue 2 years ago • 2 comments

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

caufieldjh avatar Oct 15 '21 02:10 caufieldjh

Hi @caufieldjh - is this still an issue currently? (or did you implement a workaround? - I can not reproduce).

sierra-moxon avatar Aug 16 '22 21:08 sierra-moxon

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.

caufieldjh avatar Aug 16 '22 21:08 caufieldjh