web-dev-qa-db-fra.com

JSON sérialisant Mongodb

J'utilise le paquet python python pour récupérer les données d'une base de données mongodb.

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

Puis je me convertis en une liste

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

voici ce que print (l) renvoie:

>>> [{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}]

Maintenant, je dois convertir en JSON pour pouvoir le manipuler. 

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

J'ai aussi essayé de suivre http://api.mongodb.org/python/1.7/api/pymongo/json_util.html sans succès: link is 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  

Remarque: je dois précisément transmettre ce résultat à R à l'aide du paquetage RPython et de sa fonction rPython :: python.get ("l").

Question secondaire: Qu'est-ce que le u (date ',' nom ', etc.) avant chaque champ de la liste de dict?

17
RockScience

La documentation de pymongo que vous avez indiquée est obsolète. Si vous utilisez la version 1.7, je vous recommande de mettre à jour. Avec une version plus récente, vous pouvez faire ceci:

from bson.json_util import dumps

dumps(l)

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

Réponse côté: u'name', u'date', u'_id' etc. sont les noms des champs du document dans la base de données.

42
Rafa
from bson import json_util



json.dumps(result,default=json_util.default)
10
DhruvPathak

Je faisais face au même problème, j'ai écrit un code qui convertit le document en dictionnaire. Vous pouvez l'utiliser pour référence. Passez l'objet obtenu par find_one () à la méthode documentToJson () et les résultats de find () à convertDocumentsToJson. Il y a type dans le nom Json, à la place le code est converti en Dict plutôt que 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
0
RAX