Python-如何删除json字符串中的最后一个逗号(,)
嗨,我刚刚开始尝试python和tornado以及mongodb(我是个新手)。我编写了一个简单的get函数,用于从mongodb获取所有值,并以JSON格式返回。问题是,当我尝试将输出写入JSON字符串时,在集合的最后一条记录后面会出现一个尾随逗号(,)Python-如何删除json字符串中的最后一个逗号(,),python,json,Python,Json,嗨,我刚刚开始尝试python和tornado以及mongodb(我是个新手)。我编写了一个简单的get函数,用于从mongodb获取所有值,并以JSON格式返回。问题是,当我尝试将输出写入JSON字符串时,在集合的最后一条记录后面会出现一个尾随逗号(,) class TypeList(APIHandler): @gen.coroutine def get(self): cursor = db.vtype.find() self.write("{"'"success"'": 1,
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:“55a5eacc6545779f35d3ecdf5},“Name:“asdf”}
使用转储[{“数据”:文档}]
我得到的输出是
[{"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"}}]}
如果我做错了什么,请告诉我我不知道怎么做。没有理由通过文本连接来构建JSON文档
Python在标准库中有一个非常好的
json
模块,您应该使用它。将您的文档构建为DICT的Python列表,然后使用json.dumps()
将整个内容转换为有效的json。您的JSONEncoder实现运行良好。只需按照预期的方式使用即可:
>>> JSONEncoder().encode({'data': [ObjectId(), ObjectId()]})
'{"data": ["<objId>", "<objId>"]}'
>>JSONEncoder().encode({'data':[ObjectId(),ObjectId()]})
“{”数据“:[”“,”“]}”
编码器将负责序列化dict、对象、列表、元组、字符串(包括unicode)、int、long、float、boolean和None。您的实现还可以让它知道ObjectId
s。太好了
只需丢失字符串连接并使用
encode那么您的问题是MongoDBObjectId
?那也许你应该一直用。它可能已经作为MongoDB驱动程序依赖项的一部分安装了(这些驱动程序都使用pymongo),但如果没有安装,请安装它
import bson
import bson.json_util
from bson.json_util import dumps
from bson import ObjectId
dumps({ "a": ObjectId() })
'{"a": {"$oid": "55a782261d41c80b0432b811"}}'
或:
它的工作原理与“转储”类似,只是所有BSON类型的处理都是由它构建的
再次强调,无需在这里重新发明轮子并“滚动您自己的”,因为人们已经使用了它。您可能希望在使用JSON转储(JSON.dumps)时,实际上我得到一个错误“ObjectId(addsfsfsf)”不是JSON序列化的。ObjectId来自我的mongodbMaybe,你应该问一下。我编写了类JSONECODER
,以克服序列化程序的问题。不过,为什么要重新发明轮子;如果您解决了json.dumps()
的问题,您可能现在就不需要麻烦了。使用self.write(json.dumps(document))
获取错误TypeError:ObjectId('55a5e988545779f35d3ecdf4')时,json不能序列化。我使用json.dumps的方法正确吗me@TonyRoczz这里的观点是正确的。但是您的mongodb库中有一个自定义版本的“dumps”。为了克服JSON可序列化错误,我使用了PyMongo中的bson.JSON_util,您已经在Motor中安装了它。您可以发布特定的字符串吗?我已经从bson.json_util导入了转储,但是它给了我一个不可序列化的jsonerror@TonyRoczz代码示例就在那里。支持正确标识字段“类型”的输出。不管怎样,都在文档中。当我使用print而不是self时,转储工作正常。write@TonyRoczz伟大的所以使用它。这里的信息是构建您自己的dict,使用自然的dict响应,并让其他东西处理序列化。就像CSV一样,这不是什么新鲜事,所以以前都做过。谢谢。上面的示例是有效的,但问题是上面的示例没有区分表的不同记录。输出是这样的:{“type”:“adfs”,“_id”:12345.0,“brand”:“asd”}{“type”:“adfs”,“_id”:12345.0,“brand”:“asd”}
不同记录之间应该有一个逗号,否则它不是一个正确的json字符串。这两条记录之间不应该用逗号分隔吗?你能告诉我我的代码应该如何形成吗。你对我的jsonecoder().encode(document)
语句有何建议。提前谢谢你我认为Blake的答案更好,但是如果你想保留JSONEncoder
你可以尝试类似JSONEncoder()的东西。encode({'success':1,'data':items})
其中items
是查询返回的文档列表。您可能可以一次获得它们,或者使用现有循环填充最初为空的数组。
dumps([{ "a": ObjectId(), "b": 1 },{ "a": ObjectId(), "b": 2 }])
'[{"a": {"$oid": "55a79543268e150463d51799"}, "b": 1}, {"a": {"$oid": "55a79543268e150463d5179a"}, "b": 2}]'