No se puede deserializar PyMongo ObjectId de JSON

Parece que no puedo deserializar mi documento MongoDB JSON con BSON json_util .

La función json.loads está obstruyendo la cadena ObjectId() . Había entendido json_util capaz de manejar el formato ObjectId de MongoDB y transformarlo en JSON utilizable.

Código Python:

 import json from bson import json_util s = "{u'_id': ObjectId('4ed559abf047050c58000000')}" u = json.loads(s, object_hook=json_util.object_hook) 

Me sale la excepción del decodificador:

 ... u = json.loads(s, object_hook=json_util.object_hook) File "\python27\lib\json\__init__.py", line 339, in loads return cls(encoding=encoding, **kw).decode(s) File "\python27\lib\json\decoder.py", line 366, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "\python27\lib\json\decoder.py", line 382, in raw_decode obj, end = self.scan_once(s, idx) ValueError: Expecting property name: line 1 column 1 (char 1) 

¿Me estoy perdiendo de algo?

Creo que tu forma de cadena realmente se parece a la representación de python …

 s = '{"_id": {"$oid": "4edebd262ae5e93b41000000"}}' u = json.loads(s, object_hook=json_util.object_hook) print u # Result: {u'_id': ObjectId('4edebd262ae5e93b41000000')} s = json.dumps(u, default=json_util.default) print s # Result: {"_id": {"$oid": "4edebd262ae5e93b41000000"}} 

La función bson.json_util.object_hook no parece tener ningún tipo de manejo para que haya ObjectId () en la representación real de la cadena json.

Hay dos problemas aquí:

  1. La cadena que estás intentando descifrar con JSON no es JSON, es la representación de la cadena de un diccionario de Python. En particular, el problema es que u'_id' no es una clave JSON válida (las claves JSON son cadenas entre comillas; la “u” aquí indica una cadena Unicode de Python, que no tiene sentido en JSON)

  2. json_util.object_hook no hace que ObjectId esté disponible para JSON; el módulo json descodificará el JSON y luego llamará a la object_hook llamada object_hook con cada objeto descodificado. json_util.object_hook buscará ciertos patrones como se define en el modo estricto de MongoDB Extended JSON .

Consulte la respuesta de @jdi para ver ejemplos de cómo usar correctamente json_util .