【问题标题】:Unable to deserialize PyMongo ObjectId from JSON无法从 JSON 反序列化 PyMongo ObjectId
【发布时间】:2012-01-14 14:28:17
【问题描述】:

我似乎无法使用 BSON json_util 反序列化我的 MongoDB JSON 文档。

json.loads 函数在ObjectId() 字符串上阻塞。我了解 json_util 能够处理 MongoDB 的 ObjectId 格式并转换为可用的 JSON。

Python 代码:

import json    
from bson import json_util

s = "{u'_id': ObjectId('4ed559abf047050c58000000')}"
u = json.loads(s, object_hook=json_util.object_hook)

我得到解码器异常:

...
    u = json.loads(s, object_hook=json_util.object_hook)
  File "\python27\lib\json\__init__.py", line 339, in loads
    return cls(encoding=encoding, **kw).decode(s)
  File "\python27\lib\json\decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "\python27\lib\json\decoder.py", line 382, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting property name: line 1 column 1 (char 1)

我错过了什么吗?

【问题讨论】:

    标签: python json mongodb pymongo bson


    【解决方案1】:

    我认为你的字符串形式实际上看起来像 python 表示......

    s = '{"_id": {"$oid": "4edebd262ae5e93b41000000"}}'
    u = json.loads(s, object_hook=json_util.object_hook)
    
    print u  # Result:  {u'_id': ObjectId('4edebd262ae5e93b41000000')}
    
    s = json.dumps(u, default=json_util.default)
    
    print s  # Result:  {"_id": {"$oid": "4edebd262ae5e93b41000000"}}
    

    bson.json_util.object_hook 函数似乎没有任何类型的处理,因为在实际的 json 字符串表示中有 ObjectId()。

    【讨论】:

    • 好的,在查看@dcrosta 的建议以查看 MongoDB Extended JSON mongodb.org/display/DOCS/Mongo+Extended+JSON 之后,让我尝试将 data_oid 从 TenGen BSON 类型转换为 Strict JSON,即“$oid”。
    • json.dumps 建议效果很好。 s = json.dumps(u, default=json_util.default),输出 {"_id": {"$oid": "4ed559abf047050c58000000"}}。谢谢@jdi
    • 大家好,我也想转换 mongo 结果的 ObjectId(),我尝试执行上面的代码,我收到以下错误 NameError: global name 'json_util' is not defined 是我需要导入的任何库吗? ,我已经导入了bson 库,但还是一样的错误
    • @SaradaAkurathi 当我写完这个答案时。 5 年前, json_util 是 bson 模块的一部分(如答案中所述)。现在不是这样了吗?
    • @jdi,我为 json_util 找到了这个json_util。选项bson.json_util.default 仍然存在。之前导入错误的问题,现在我导入了正确的库,上面的错误消失了,但结果仍然没有转换。你能帮忙解决问题吗
    【解决方案2】:

    这里有两个问题:

    1. 您尝试进行 JSON 解码的字符串不是 JSON,它是 Python 字典的字符串表示形式。特别是u'_id'不是有效的JSON键(JSON键是带引号的字符串;这里的“u”表示Python的unicode字符串,在JSON中没有意义)

    2. json_util.object_hook 不会使 ObjectId 可用于 JSON; json 模块将解码 JSON,然后使用每个解码的对象调用 object_hook 回调。 json_util.object_hook 将查找在 MongoDB Extended JSON 的严格模式中定义的某些模式。

    有关如何正确使用json_util 的示例,请参阅@jdi 的答案。

    【讨论】:

    • RE: 1. 嗨 dcrosta,我在示例中使用的字符串取自应用程序日志,因此额外的 python unicode 'u'。
    猜你喜欢
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 2013-07-26
    相关资源
    最近更新 更多