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)