2011-12-07 19 views
8

Parece que no puedo deserializar mi documento MongoDB JSON con el BSON json_util.No se puede deserializar PyMongo ObjectId de JSON

La función json.loads se está ahogando en 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) 

consigo 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 algo?

Respuesta

15

creo que su forma de cadena realidad se parece a la representación de pitón ...

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 parecen tener ningún tipo de manipulación para que exista OBJECTID() en el real json cadena de representación.

+0

Bien, después de ver la sugerencia de @dcrosta para revisar MongoDB Extended JSON http://www.mongodb.org/display/DOCS/Mongo+Extended+JSON, permítanme intentar convertir el data_oid del tipo TenGen BSON a Strict JSON , es decir, "$ oid". – jdev

+1

La sugerencia de json.dumps funcionó perfectamente. s = json.dumps (u, default = json_util.default), output {"_id": {"$ oid": "4ed559abf047050c58000000"}}. Gracias @jdi – jdev

+0

Hola a todos, también quiero convertir ObjectId() del resultado de mongo, intenté ejecutar el código anterior, recibo el siguiente error 'NameError: nombre global 'json_util' no está definido' es cualquier biblioteca que necesito ¿importar? , he importado la biblioteca 'bson', pero igual error –

3

Hay dos problemas aquí:

  1. La cadena que está tratando de JSON-decodificación no es JSON, que es la representación de cadena de un diccionario de Python. En particular, el problema es que u'_id' no es una clave válida JSON (teclas JSON se citan cadenas; la "u" aquí indica una cadena Unicode de Python, que no tiene sentido en JSON)

  2. json_util.object_hook no hace ObjectId disponibles a JSON; el módulo json decodificará el JSON, y luego llamará a la devolución de 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.

+0

RE: 1. Hola dcrosta, la cadena que había usado en mi ejemplo fue tomada del registro de la aplicación. de ahí el pitón extra Unicode 'u'. – jdev

Cuestiones relacionadas