Incapaz de deserializar PyMongo ObjectId de JSON

Estoy aparentemente incapaces de deserializar mi MongoDB documento JSON con el HIJO json_util.

El json.las cargas de la función se está ahogando en el ObjectId() cadena. Yo había entendido json_util capaz de manejar MongoDB del ObjectId formato y en la transformación de los utilizable JSON.

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)

Tengo el decodificador de excepción:

...
    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)

Que me estoy perdiendo algo?

InformationsquelleAutor jdev | 2011-12-07

2 Kommentare

  1. 18

    Creo que su forma de cadena, en realidad se parece a la de python representació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"}}

    El hijo.json_util.object_hook función no parece tener ningún tipo de manipulación por el que hay ObjectId() en el real de la cadena json representación.

    • Ok, después de mirar @dcrosta propuesta de revisión de MongoDB Extendido JSON mongodb.org/display/DOCS/Mongo+Extended+JSON, déjame en lugar de tratar de convertir la data_oid de TenGen BSON tipo de Estricta JSON, es decir, «$oid».
    • El json.volcados sugerencia funcionó a la perfección. s = json.vertederos(u, por defecto=json_util.de forma predeterminada), salida {«_id»: {«$oid»: «4ed559abf047050c58000000»}}. Gracias @jdi
    • Hola a Todos, yo también quiero conver ObjectId() de la mongo resultado, intenté ejecutar código anterior, recibo el siguiente error NameError: global name 'json_util' is not defined es cualquier biblioteca necesito para importar? he importado bson biblioteca, pero sigue el mismo error
    • cuando escribí esta respuesta más. Hace 5 años, json_util se parte de que el hijo del módulo (como se documenta en la respuesta). Es que ya no es el caso?
    • he encontrado este json_util para json_util. opción bson.json_util.default todavía está allí. problema anterior con mal de importación, ahora me importan biblioteca correcta, el error anterior se ha ido, pero el resultado no es convertido. Usted puede ayudar a lo que salió mal
    • No estoy seguro de cuál es su problema. Usted puede ser mejor servido por la apertura de una nueva pregunta con los detalles de su problema. Esta pregunta es bastante antiguo, y los comentarios no son realmente el mejor lugar para solucionar
    • ok gracias, seguro que me va a abrir una nueva pregunta

  2. 3

    Hay dos problemas aquí:

    1. La cadena que está tratando de JSON-descodificación no es JSON, es la representación de cadena de un diccionario de Python. En particular, el problema es que u'_id' no es válido JSON clave (JSON claves son cadenas entre comillas; la «u» indica aquí un Python cadena unicode, que es de sentido en JSON)

    2. json_util.object_hook no hacer ObjectId disponible para JSON; el json módulo de decodificar el JSON y, a continuación, llamar a la object_hook de devolución de llamada con cada decodificado objeto. json_util.object_hook buscará ciertos patrones, como se define en el modo estricto de MongoDB Extendido JSON.

    Ver @jdi la respuesta de los ejemplos de cómo utilizar correctamente json_util.

    • RE: 1. Hola dcrosta, la cadena había utilizado en mi ejemplo fue tomado de la aplicación de registro, de ahí el extra de python unicode ‘u’.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea