Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-如何删除json字符串中的最后一个逗号(,)_Python_Json - Fatal编程技术网

Python-如何删除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,

嗨,我刚刚开始尝试python和tornado以及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:“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

那么您的问题是MongoDB
ObjectId
?那也许你应该一直用。它可能已经作为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}]'