w3schools json_util example python mongodb pymongo rpython

python - json_util - JSON serializando Mongodb



python mongodb example (3)

Estoy usando el paquete python pymongo para recuperar datos de una base de datos mongodb.

>>> r = collection.find() # returns an object of class ''Cursor''

Entonces me convierto a una lista

>>> l = list(r) # returns a ''list'' of ''dict''

Esto es lo que imprime (l) devuelve:

>>> [{u''date'': datetime.datetime(2009, 11, 10, 10, 45), u''_id'': 1, u''name'': u''name1'', u''value'': 11},{u''date'': datetime.datetime(2013, 11, 10, 10, 45), u''_id'': 2, u''name'': u''name2'', u''value'': 22}]

Ahora necesito convertir a JSON para poder manipularlo.

>>> json.dumps(l) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps return _default_encoder.encode(obj) File "/usr/lib/python2.7/json/encoder.py", line 201, in encode chunks = self.iterencode(o, _one_shot=True) File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode return _iterencode(o, 0) File "/usr/lib/python2.7/json/encoder.py", line 178, in default raise TypeError(repr(o) + " is not JSON serializable") TypeError: datetime.datetime(2009, 11, 12, 11, 14) is not JSON serializable

También he intentado seguir http://api.mongodb.org/python/1.7/api/pymongo/json_util.html sin éxito: Edit: la versión reciente del enlace es http://api.mongodb.org/python/current/api/bson/json_util.html

>>> json.dumps(l, default=json_util.default) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name ''json_util'' is not defined

Nota: precisamente necesito enviar este resultado a R usando el paquete R rPython y su función rPython :: python.get ("l")

Pregunta lateral : ¿Qué es la u (u''Date '', u''name'', etc.) antes de cada campo en la lista de dict?


Estaba enfrentando el mismo problema, escribí un código que convierte el documento al diccionario. Puedes usar eso como referencia. Pase el objeto obtenido por find_one () en el método documentToJson () y los resultados de find () en convertDocumentsToJson. Hay un tipo en el nombre Json, en lugar de que el código se convierta en Dict en lugar de json.

from bson.json_util import dumps class UtilService: def __init__(self): pass @staticmethod def pinCodeParser(path): location = {} f = open(path) for line in f: words = line.split() location[words[1]] = (words[-3],words[-2]) return location @staticmethod def listHelper(str): s = [] str = str.split('','') for e in str: s.append(e.replace("[","").replace("]","")) return s @staticmethod def parseList(str): if '','' in str: return UtilService.listHelper(str) return str @staticmethod def trimStr(str): return str.replace(''"'','''') @staticmethod def documentToJson(document): document = eval(dumps(document)) mp = {} for key, value in document.iteritems(): if "_id" in key: mp["id"] = str(value["$oid"]) else: mp[ UtilService.trimStr(key) ] = UtilService.parseList( value ) return mp @staticmethod def convertDocumentsToJson(documents): result = [] for document in documents: result.append(UtilService.documentToJson(document)) return result


La documentación de pymongo que has señalado es obsoleta. Si estás usando la versión 1.7 te recomiendo actualizar. Con una versión más reciente puedes hacer esto:

from bson.json_util import dumps dumps(l)

http://api.mongodb.org/python/current/api/bson/json_util.html

Respuesta del lado : u''name'' , u''date'' , u''_id'' etc. son los nombres de los campos del documento en la base de datos.


from bson import json_util json.dumps(result,default=json_util.default)