Flask Restful/Pymongo JSON 输出中的 JSON 字符串(或输出中的 "\")
首先,我参考了一些我阅读过的其他问题的链接。这些链接可能会给我现在遇到的问题提供一些线索,尽管我还不够理解,无法看到解决方案。
我该如何使用Python将MongoDB的bsondump转换为JSON?
我正在开发一个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 个回答
谢谢你的回复!我遇到过和你一样的问题,刚好因为你分享了解决方案,所以问题解决了,真是太感谢了!下面是我的代码。
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 }
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)来实现的。
我认为问题出在 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)