Problem:
When trying to export data as JSON that has originally been queried from MongoDB using code like
with open("alle.json", "w") as outfile: json.dump(alle, outfile)
you see the following error message:
File /usr/lib/python3.9/json/__init__.py:179, in dump(obj, fp, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, default, sort_keys, **kw) 173 iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii, 174 check_circular=check_circular, allow_nan=allow_nan, indent=indent, 175 separators=separators, 176 default=default, sort_keys=sort_keys, **kw).iterencode(obj) 177 # could accelerate with writelines in some versions of Python, at 178 # a debuggability cost --> 179 for chunk in iterable: 180 fp.write(chunk) File /usr/lib/python3.9/json/encoder.py:429, in _make_iterencode.<locals>._iterencode(o, _current_indent_level) 427 yield _floatstr(o) 428 elif isinstance(o, (list, tuple)): --> 429 yield from _iterencode_list(o, _current_indent_level) 430 elif isinstance(o, dict): 431 yield from _iterencode_dict(o, _current_indent_level) File /usr/lib/python3.9/json/encoder.py:325, in _make_iterencode.<locals>._iterencode_list(lst, _current_indent_level) 323 else: 324 chunks = _iterencode(value, _current_indent_level) --> 325 yield from chunks 326 if newline_indent is not None: 327 _current_indent_level -= 1 File /usr/lib/python3.9/json/encoder.py:405, in _make_iterencode.<locals>._iterencode_dict(dct, _current_indent_level) 403 else: 404 chunks = _iterencode(value, _current_indent_level) --> 405 yield from chunks 406 if newline_indent is not None: 407 _current_indent_level -= 1 File /usr/lib/python3.9/json/encoder.py:438, in _make_iterencode.<locals>._iterencode(o, _current_indent_level) 436 raise ValueError("Circular reference detected") 437 markers[markerid] = o --> 438 o = _default(o) 439 yield from _iterencode(o, _current_indent_level) 440 if markers is not None: File /usr/lib/python3.9/json/encoder.py:179, in JSONEncoder.default(self, o) 160 def default(self, o): 161 """Implement this method in a subclass such that it returns 162 a serializable object for ``o``, or calls the base implementation 163 (to raise a ``TypeError``). (...) 177 178 """ --> 179 raise TypeError(f'Object of type {o.__class__.__name__} ' 180 f'is not JSON serializable') TypeError: Object of type ObjectId is not JSON serializable
Solution:
This error occurs because objects queried from PyMongo always contain _id
which is of type ObjectId
and the normal JSON library (or drop-in replacements like simplejson
do not know how to create JSON representations of Objects of type ObjectId
).
In order to fix this, use pymongo
‘s json_util
instead of json
. Note that the bson.json_util
package contains dumps
but does not contain dump
, so use the following snippet to write to a file:
import bson.json_util as json_util with open("alle.json", "w") as outfile: outfile.write(json_util.dumps(alle))