【问题标题】:Python - how to remove the final comma(,) in json stringPython - 如何删除json字符串中的最后一个逗号(,)
【发布时间】:2015-10-05 15:55:35
【问题描述】:

您好,我刚刚开始尝试使用 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": "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"}}]}

如果我做错了什么,请告诉我我不知道该怎么做。

【问题讨论】:

  • 你可能想look at this
  • 实际上在使用 JSON 转储 (json.dumps) 时出现错误“ObjectId(addsfsfsf)”不是 JSON 可序列化的。 ObjectId 来自我的 mongodb
  • 也许你的问题应该问这个问题。
  • 我写了class JSONEncoder 来解决这个序列化程序问题。
  • 为什么要重新发明轮子?如果您发现了 json.dumps() 的问题,您现在可能不需要为此烦恼。

标签: python json


【解决方案1】:

您没有理由通过文本连接来构建 JSON 文档。

Python 在您应该使用的标准库中有一个非常好的json 模块。将您的文档构建为 Python 字典列表,然后使用 json.dumps() 将整个内容转换为有效的 JSON。

【讨论】:

  • 使用self.write(json.dumps(document)) 时出现错误TypeError: ObjectId('55a5e988545779f35d3ecdf4') is not JSON serializable。我是否以正确的方式使用 json.dumps 请指导我
  • @TonyRoczz 这里的观点是正确的。但是您的 mongodb 库中有一个自定义版本的“转储”。
  • 克服 JSON 可序列化错误我有referred to
  • 使用来自 PyMongo 的 bson.json_util,您已经与 Motor 一起安装了它。
【解决方案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 类型处理都是由它构建的。

同样,无需在这里重新发明轮子并“自己动手”,因为人们已经在使用它了。

【讨论】:

  • 你能发布特定的字符串吗?我已经从 bson.json_util 导入了转储,但它给了我 JSON 不可序列化错误
  • @TonyRoczz 编码示例就在那里。支持"extended json" 的输出,它正确识别了字段的“类型”。无论如何都在文档中。
  • 当我使用 print 而不是 self.write 时,转储工作正常
  • @TonyRoczz 太好了。所以使用它。这里的信息是构建你自己的 dicts,使用自然的 dict 响应并让其他东西来处理序列化。和 CSV 一样,也不是什么新鲜事,所以都是以前做过的。
  • 谢谢。上面的例子有效,但问题是上面的例子没有区分表的不同记录输出就像这样{"type": "adfs", "_id": 12345.0, "brand": "asd"}{"type": "adfs", "_id": 12345.0, "brand": "asd"}在不同的记录之间应该有一个逗号,否则它不是一个正确的json字符串。两个记录之间不应该有逗号分隔吗?
【解决方案3】:

您的 JSONEncoder 实现运行良好。只需按照预期的方式使用它:

>>> JSONEncoder().encode({'data': [ObjectId(), ObjectId()]})
'{"data": ["<objId>", "<objId>"]}'

编码器将负责序列化字典、对象、列表、元组、字符串(包括 unicode)、整数、长整数、浮点数、布尔值和无。您的实现也让它知道ObjectIds。完美!

只需丢失字符串连接并使用encode

【讨论】:

  • 您能否指导我如何为此编写代码。你如何建议我的JSONEncoder().encode(document) 声明应该是。提前谢谢你
  • 我认为 Blake 的答案更好,但如果您想保留 JSONEncoder,您可以尝试类似 JSONEncoder().encode({'success': 1, 'data': items}) 的内容,其中 items 是您的查询返回的文档列表。您可能可以一次全部获取它们,或者使用现有的循环来填充最初为空的数组。
猜你喜欢
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 2013-01-23
  • 2018-09-19
相关资源
最近更新 更多