您好我刚开始尝试使用python和龙卷风以及mongodb(我是新手)。我编写了一个简单的get函数来获取我的mongodb中的所有值并以JSON格式返回它。问题是当我尝试将输出写为JSON字符串时,我在集合的最后一条记录之后得到一个尾随逗号(,)。
class TypeList(APIHandler):
@gen.coroutine
def get(self):
cursor = db.vtype.find()
self.write("{"'"success"'": 1, "'"data"'":[")
while (yield cursor.fetch_next):
document = cursor.next_object()
self.write(format(JSONEncoder().encode(document)))
self.write(",")
self.write("]}")
class JSONEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o,ObjectId):
return str(o)
return json.JSONEncoder.default(self, o)
我的输出就像
{"success": 1, "data":[{"_id": "55a5e988545779f35d3ecdf4", "name": "fgkd", "city": "fghj"},{"_id": 12345.0, "name": "adfs", "city": "asd"},]}
任何人都可以告诉我如何在我的最后一条记录之后摆脱那个尾随的逗号(,),因为那个逗号我收到错误的JSON字符串错误
我尝试过使用json转储
@gen.coroutine
def get(self):
cursor = db.vtype.find({"brand": "Tata"})
while (yield cursor.fetch_next):
document = cursor.next_object()
self.write(json.dumps(document,default=json_util.default))
输出为
{"Reg": "11ts", "_id": {"$oid": "55a5e988545779f35d3ecdf4"}, "Name": "Alex"}{"Reg": "12ts", "_id": {"$oid": "55a5eac6545779f35d3ecdf5"}, "Name": "asdf"}
使用dumps[{ "data": document }]
我的输出为
[{"data": {"Name": "asdf", "Reg": "asdfs", "_id": {"$oid": "55a5e988545779f35d3ecdf4"}}}]
[{"data": {"Name": "qwer", "Reg": "asdff", "_id": {"$oid": "55a5eac6545779f35d3ecdf5"}}}]
但我想要像这样的输出
{"data": [{"Name": "asdf", "Reg": "asdfs", "_id": {"$oid": "55a5e988545779f35d3ecdf4"}},{"Name": "qwer", "Reg": "asdff", "_id": {"$oid": "55a5eac6545779f35d3ecdf5"}}]}
如果我做错了,请告诉我,我不知道怎么做。
答案 0 :(得分:6)
您没有理由通过文本连接构建JSON文档。
Python在标准库中有一个非常好的json
模块,你应该使用它。将您的文档构建为Python的dicts列表,然后使用json.dumps()
将整个事物转换为有效的JSON。
答案 1 :(得分:2)
那你的问题是MongoDB ObjectId
吗?那么也许你应该使用bson.json_util
。它可能已经安装为MongoDB驱动程序依赖项的一部分(都使用pymongo),但如果没有,则安装它。
import bson
import bson.json_util
from bson.json_util import dumps
from bson import ObjectId
dumps({ "a": ObjectId() })
'{"a": {"$oid": "55a782261d41c80b0432b811"}}'
或者:
dumps([{ "a": ObjectId(), "b": 1 },{ "a": ObjectId(), "b": 2 }])
'[{"a": {"$oid": "55a79543268e150463d51799"}, "b": 1}, {"a": {"$oid": "55a79543268e150463d5179a"}, "b": 2}]'
它就像"转储"除了所有BSON类型处理都构建它。
同样,不需要在这里重新发明轮子并且#34;滚动你自己的#34;,因为人们已经使用了它。
答案 2 :(得分:0)
您对JSONEncoder的实现很有效。只需按照预期的方式使用它:
>>> JSONEncoder().encode({'data': [ObjectId(), ObjectId()]})
'{"data": ["<objId>", "<objId>"]}'
编码器将负责序列化dicts,对象,列表,元组,字符串(包括unicode),整数,长整数,浮点数,布尔值和无。您的实现也使其了解ObjectId
。完美!
丢失字符串连接并使用encode
。