Flask Restful/Pymongo JSON 输出中的 JSON 字符串(或输出中的 "\")

0 投票
3 回答
937 浏览
提问于 2025-04-18 03:20

首先,我参考了一些我阅读过的其他问题的链接。这些链接可能会给我现在遇到的问题提供一些线索,尽管我还不够理解,无法看到解决方案。

我该如何使用Python将MongoDB的bsondump转换为JSON?

无法从JSON反序列化PyMongo的ObjectId

我正在开发一个Flask Restful API。以下是我的代码片段:

class DeviceAPI(Resource):

    def get(self, deviceID):
        # do the query
        deviceCollection = db['device']
        device = deviceCollection.find_one({'deviceID': deviceID})

        print device   #1
        print ''

        print json_util.dumps(device)   #2
        print ''

        s = json_util.dumps(device)
        print s  #3
        print ''

        results = {}
        results['device'] = s 

        print results  #4

        # respond
        return results #5

在打印#1时,我得到了以下结果,我理解并且预期会这样。

{u'deviceID': u'ABC123', u'_id': ObjectId('....')}

打印#2和#3的输出是相同的,正如我所预期的,我也理解这一点(我想是这样)。

{"deviceID": "ABC123", "_id": {"$oid": "...."}}

打印#4的字典中多了一个键。不过,这个键的值看起来是一个字符串,而应该是像#2和#3那样的字典。

{'device': '{"deviceID": "ABC123", "_id": {"$oid": "...."}}'}

根据CURL返回的结果#5,大致是这样的。里面多了/。我怀疑是因为#4的值看起来像字符串,这种情况在#5中也继续存在。

{"device": "{\"deviceID\": \"ABC123\", \"_id\": {\"$oid\": \"....\"}}"}

我想要的是纯粹的JSON输出,而不是设备文档的字符串表示。#2和#3看起来像JSON,但在#4中变成了字符串。为什么会这样?我该如何正确处理?

3 个回答

0

谢谢你的回复!我遇到过和你一样的问题,刚好因为你分享了解决方案,所以问题解决了,真是太感谢了!下面是我的代码。

from flask_restplus import Namespace, Resource, fields
from .. import mongo

import json
from bson import json_util

api = Namespace('inventory', description='Store management related operations')

@api.route('/items')
class Inventory(Resource):
    def get(self):
        inventory_collection = mongo.db.inventory
        resp = inventory_collection.find({})
        a = json.loads(json_util.dumps(resp))
        return {'result': a }


1

Michael0x2a帮我理清了一些思路,经过更多的实验和思考,下面的方法对我有效。

results['device'] = json.loads(json_util.dumps(device))

在我的实验中,我使用了json_util.dumps和json_util.loads这两个函数。但是我没有意识到,json_util.dumps是把类似BSON的东西转换成JSON字符串,而json_util.loads则是直接把它转换回去。因此,我需要另一个函数来把json_util.dumps输出的字符串形式的JSON转换成字典形式的JSON对象。所以我需要一个组合的方法。这是通过“import json”和“from bson import json_util”(来自Pymongo)来实现的。

1

我认为问题出在 json_utils.dumps 这个函数上,它把你的 device 变量转换成了字符串,而你其实应该返回一个完整的 json 对象。这样一来,你最终返回的东西看起来像这样:

return {"device": "a string that resembles json"}

相反,你应该把代码修改成这样:

class DeviceAPI(Resource):
    def get(self, deviceID):
        # do the query
        deviceCollection = db['device']
        device = deviceCollection.find_one({'deviceID': deviceID})

        results = {'device': device}
        return results

现在,我们返回的 json 看起来更像这样:

return {"device": {"deviceID": "ABC123", "_id": {"$oid": "...."}}}

不过,看起来在 Flask 中推荐的返回 json 的方法是使用 flask.jsonify 这个方法,这样 Flask 才能返回一个合适的响应对象:

from flask import jsonify

class DeviceAPI(Resource):
    def get(self, deviceID):
        # do the query
        deviceCollection = db['device']
        device = deviceCollection.find_one({'deviceID': deviceID})

        return jsonify(device=device)

撰写回答