2011-12-07 48 views
8

Tôi dường như không thể deserialize tài liệu JSON MongoDB của tôi với BSON json_util.Không thể deserialize PyMongo ObjectId từ JSON

Hàm json.loads bị nghẹt thở trên chuỗi ObjectId(). Tôi đã hiểu json_util có khả năng xử lý định dạng ObjectId của MongoDB và chuyển đổi thành JSON có thể sử dụng được.

mã Python:

import json  
from bson import json_util 

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

tôi nhận được ngoại lệ giải mã:

... 
    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) 

Tôi có thiếu cái gì?

Trả lời

15

Tôi nghĩ rằng hình thức chuỗi của bạn thực sự trông giống như các đại diện 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"}} 

Chức năng bson.json_util.object_hook dường như không có bất kỳ loại hình xử lý cho có là ObjectId() trong thực tế biểu diễn chuỗi json.

+0

Ok, sau khi xem gợi ý @ dcrosta để xem xét MongoDB Mở rộng JSON http://www.mongodb.org/display/DOCS/Mongo+Extended+JSON, hãy để tôi thay vì thử chuyển đổi data_oid từ loại BSG TenGen thành JSON chuẩn , tức là "$ oid". – jdev

+1

Đề xuất json.dumps hoạt động hoàn hảo. s = json.dumps (u, default = json_util.default), output {"_id": {"$ oid": "4ed559abf047050c58000000"}}. Cảm ơn @jdi – jdev

+0

Hi All, tôi cũng muốn conver ObjectId() của kết quả mongo, tôi đã cố gắng để thực hiện trên mã, tôi nhận được lỗi sau 'NameError: tên toàn cầu 'json_util' không được định nghĩa' là bất kỳ thư viện tôi cần nhập khẩu? , tôi đã nhập thư viện 'bson' nhưng vẫn lỗi tương tự –

3

Có hai vấn đề ở đây:

  1. Chuỗi bạn đang cố gắng JSON-decode không phải là JSON, đó là chuỗi đại diện của một cuốn từ điển Python. Đặc biệt, vấn đề là u'_id' không phải là một chìa khóa JSON hợp lệ (phím JSON được trích dẫn chuỗi; các "u" ở đây chỉ ra một chuỗi Python unicode, đó là vô nghĩa trong JSON)

  2. json_util.object_hook không làm ObjectId sẵn thành JSON; mô-đun json sẽ giải mã JSON và sau đó gọi lại số gọi object_hook với từng đối tượng được giải mã. json_util.object_hook sẽ tìm các mẫu nhất định như được xác định trong chế độ nghiêm ngặt của MongoDB Extended JSON.

Xem câu trả lời của @ jdi để biết ví dụ về cách sử dụng đúng cách json_util.

+0

RE: 1. Hi dcrosta, chuỗi tôi đã sử dụng trong ví dụ của tôi được lấy từ nhật ký ứng dụng, do đó thêm unicode unicode 'u'. – jdev

Các vấn đề liên quan