28

我正在使用 python 包 pymongo 从 mongodb 数据库中检索数据。

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

然后我转换为列表

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

这是 print(l) 返回的内容:

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

现在我需要转换为 JSON 以便我可以操作它。

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

我也尝试关注http://api.mongodb.org/python/1.7/api/pymongo/json_util.html但没有成功: 编辑:链接的最新版本是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  

注意:正是我需要使用 R 包 rPython 及其函数 rPython::python.get("l") 将此结果推送到 R

附带问题:dict列表中每个字段之前的u(u'Date',u'name'等)是什么?

4

5 回答 5

59

您指出的 pymongo 文档已过时。如果您使用的是 1.7 版,我建议您更新。使用更新的版本,您可以这样做:

from bson.json_util import dumps

dumps(l)

https://pymongo.readthedocs.io/en/stable/api/bson/json_util.html

侧面答案u'name',u'date'u'_id'是数据库中文档的字段名称。

于 2013-10-30T05:17:46.443 回答
13
from bson import json_util



json.dumps(result,default=json_util.default)
于 2013-10-30T06:44:53.027 回答
2

在我的情况下,这个错误是由于烧瓶中的 mongo DB id 对象,你所要做的就是转换 id (注意:如果你需要 id 转换它,你也可以弹出它)我正在分享我的解决方案,我想出了希望这可以帮助某人

from flask import jsonify

def get_data(self,data):
     data['_id'] = str(data['_id'])
     return data

app =  Flask(__name__)

@app.route('/')
def apimethod():
     temp = [self.get_data(i) for i in self.collection.find()]
     return jsonify(temp)

pymongo 的转储也无济于事

from bson.json_util import dumps,loads

因为它返回一个字符串而不是 dict 在我的情况下创建 API 是预期的,如果我做了转储,我必须再次加载。

于 2020-08-01T14:12:31.273 回答
0

我遇到了同样的问题,我写了一个将文档转换为字典的代码。您可以将其用作参考。将 find_one() 得到的对象传递给 documentToJson() 方法,将 find() 的结果传递给 convertDocumentsToJson。名称 Json 中有类型,而不是代码转换为 Dict 而不是 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
于 2018-07-24T11:36:11.793 回答
0

这个线程帮助了我 - 谢谢。

想分享我的最终解决方案,以将 JSON 恢复为 JSON/字典对象:(基于您的示例)

from bson.json_util import dumps, loads
r = collection.find()
l = list(r) # Converts object to list
d = dumps(l) # Converts to String
dict_needed = loads(d[0]) # Serializes String and creates dictionary

现在您在字典对象中拥有 JSON,并且可以根据需要进行编辑。

于 2020-04-16T20:38:56.183 回答