在Python/pymongo中将bson转换为json

5 投票
1 回答
17110 浏览
提问于 2025-04-20 17:33

我正在尝试将从pymongo直接获取的bson数据转换成json数据。有没有简单的方法可以用python和pymongo或者其他工具做到这一点呢?

如果有帮助的话,这里是我的代码:

def email_main(request):
    collection = get_collection("nimbus").fullcontact_email_data
    if request.method == "POST":
        data = collection.save(dict(request.POST.iterlists()))
        response = HttpResponse(data, content_type="application/json")
    elif request.method == "GET":
        getParams = convertQuerydictToDict(request.GET)
        page, itemsPerPage = getPageDataFromDict(getParams)
        getParamsWithNoPageData = createDictWithoutPageData(getParams)
        data = collection.find(getParamsWithNoPageData)[page:page+itemsPerPage+1]
        response = HttpResponse(data, content_type="application/json")
    else:
        response = HttpResponse(status=404)
    return response


def convertQuerydictToDict(queryDict):
    return dict(queryDict.iterlists())


def getPageDataFromDict(myDict):
    if "page" in myDict and "itemsPerPage" in myDict:
        page, itemsPerPage = myDict["page"], myDict['itemsPerPage']
    elif "page" in myDict:
        page, itemsPerPage = myDict["page"], 10
    else:
        page, itemsPerPage = 0, 10
    return page, itemsPerPage

def createDictWithoutPageData(myDict):
    newDict = deepcopy(myDict)
    newDict.pop("page", None)
    newDict.pop("itemsPerPage", None)
    return newDict

基本上,那个数据变量需要被转换成正确的json格式。一定有一些内置的工具可以做到这一点。

为了更清楚,这里是我在python控制台输入数据时得到的结果:

>>> data
<pymongo.cursor.Cursor object at 0x4dd0f50>
>>> data[0]
{u'blah': u'go', u'_id': ObjectId('540e3fd8bb6933764d5650b7')}

ObjectId并不是json规范的一部分……

1 个回答

5

在上面的评论中提到,最好的方法是使用PyMongo的json_util模块,这个模块可以帮我们处理把BSON转换成JSON时那些复杂的细节。

撰写回答