10

我似乎无法使用 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)

我错过了什么吗?

4

2 回答 2

20

我认为你的字符串形式实际上看起来像 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()。

于 2011-12-07T02:04:23.963 回答
4

这里有两个问题:

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

  2. json_util.object_hookObjectId提供给 JSON;该json模块将解码 JSON,然后object_hook使用每个解码的对象调用回调。将查找在MongoDB Extended JSONjson_util.object_hook的严格模式中定义的某些模式。

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

于 2011-12-07T02:06:45.557 回答