2011-12-07 117 views
8

我似乎無法反序列化我的MongoDB JSON文檔與BSON json_util無法從JSON反序列化PyMongo ObjectId

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) 

我缺少的東西?

回答

15

我想你的字符串形式實際上看起來像蟒蛇表示...

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功能不具有任何類型的處理對於有實際存在的ObjectId() json字符串表示。

+0

好吧,在看過@ dcrosta的建議來查看MongoDB擴展JSON http://www.mongodb.org/display/DOCS/Mongo+Extended+JSON,讓我來嘗試將來自TenGen BSON類型的data_oid轉換爲Strict JSON ,即「$ oid」。 – jdev

+1

json.dumps建議完美運行。 s = json.dumps(u,default = json_util.default),output {「_id」:{「$ oid」:「4ed559abf047050c58000000」}}。謝謝@jdi – jdev

+0

大家好,我也想收斂mongo結果的ObjectId(),我試圖執行上面的代碼,我得到以下錯誤'NameError:全局名'json_util'未定義'是我需要的任何庫導入? ,我已經導入'bson'庫,但仍然是同樣的錯誤 –

3

有兩個問題在這裏:

  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的答案。

+0

RE:1.嗨,dcrosta,我用在我的例子中的字符串是從應用程序日誌,因此額外的python unicode'u'。 – jdev