关于python:无法从JSON反序列化PyMongo ObjectId

Unable to deserialize PyMongo ObjectId from JSON

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

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

Python代码:

1
2
3
4
5
import json    
from bson import json_util

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

我得到了解码器异常:

1
2
3
4
5
6
7
8
9
...
    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表示形式...

1
2
3
4
5
6
7
8
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"}}

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


这里有两个问题:

  • 您要进行JSON解码的字符串不是JSON,而是Python字典的字符串表示形式。 特别是,问题是u'_id'不是有效的JSON密钥(JSON密钥是用引号引起来的字符串;此处的" u"表示Python unicode字符串,在JSON中没有意义)

  • json_util.object_hook不能将ObjectId提供给JSON; json模块将解码JSON,然后对每个解码的对象调用object_hook回调。 json_util.object_hook将查找在MongoDB Extended JSON的严格模式下定义的某些模式。

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