Pregunta

Aparentemente no puedo deserializar mi documento JSON MongoDB con el BSON json_util.

La función JSON.OGNESS se está ahogando en el ObjectId() cuerda. Había entendido JSON_UTIL capaz de manejar el formato ObjectId de MongoDB y transformarme en JSON utilizable.

Código de Python:

import json    
from bson import json_util

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

Recibo 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?

¿Fue útil?

Solución

Creo que tu forma de cadena en realidad 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 allí objectId () en la representación real de la cadena JSON.

Otros consejos

Hay dos problemas aquí:

  1. La cadena que intentas JSON-Decode no es JSON, es la representación de una cadena de un diccionario de Python. En particular, el problema es que u'_id' no es una clave JSON válida (las teclas JSON son cadenas citadas; la "U" aquí indica una cadena de Python Unicode, que no tiene sentido en JSON)

  2. json_util.object_hook no se hace ObjectId Disponible para JSON; la json El módulo decodificará el JSON y luego llamará al object_hook devolución de llamada con cada objeto decodificado. json_util.object_hook buscará ciertos patrones como se define en el modo estricto de MongoDB extendido JSON.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top