2010-12-31 38 views
19

Tôi đã khắc phục sự cố một số mã sử dụng HTTP POST để gửi dữ liệu và phải trả lại kết quả JSON có nội dung là từ điển. Tôi đang sử dụng trình bao bọc XML-RPC để hiển thị dịch vụ này. Khi wrapper nhận được thông tin dict từ biến phản ứng http, nội dung dict đang ở trong một chuỗi theo hình thức này:Python dict to JSON qua json.loads:

{'created': datetime.datetime(2010, 12, 31, 19, 13, 8, 379909), 'worker': u'GoogleWorker', 'ready': False, 'request_id': '8f1381853a444a42a37ae5152a3af947', 'owner': u'admin', 'shortname': u'test19'} 

Tôi đang cố gắng để chuyển đổi chuỗi dưới đây vào một kết quả JSON sử dụng câu lệnh sau:

result = json.loads(response[1]) 

Tuy nhiên, khi tôi cố gắng sử dụng json.loads để chuyển đổi dữ liệu sang JSON, tôi nhận được lỗi sau: Fault: <Fault 1: "<type 'exceptions.ValueError'>:Expecting property name: line 1 column 1 (char 1)">

tôi tự cố gắng để chuyển đổi chuỗi trên để JSON, nhưng tôi nhận được cùng lỗi. Là dict không đúng theo một cách nào đó? Có phải do unicode không? Tôi cũng đã thử đặt ngôn ngữ thành UTF-8, nhưng điều đó không thành công.

Mọi trợ giúp sẽ được đánh giá cao.

+0

Cảm ơn mọi người đã giúp đỡ của bạn. Tôi nhận ra rằng tôi đang đặt câu hỏi sai, vì tôi đang cố gắng gỡ lỗi một API gửi cho tôi sử dụng django-piston và tôi đã không sử dụng nó trước đây. Câu hỏi thực tế của tôi liên quan đến django-piston và tại sao Content-Type trả lời của tôi luôn được đặt thành văn bản thuần thay vì ứng dụng/json bất cứ khi nào phản hồi là HTTP CREATED (201). Tôi sẽ hỏi điều này như một câu hỏi riêng, vì câu hỏi ban đầu là không liên quan đến vấn đề thực tế (mặc dù câu trả lời về hành vi của JSON là thú vị!). –

Trả lời

31

Bạn đang cố gắng sử dụng phương pháp sai. json.loads là dành cho tải JSON sang Python. Nếu bạn muốn chuyển đổi Python sang JSON, bạn cần json.dumps.

result = json.dumps(response[1]) 
+0

Tôi đã thực sự tìm ra điều này trước đây, nhưng sau khi xem xét tất cả các mã của tôi chi tiết hơn, tôi nhận ra rằng tôi đang đặt câu hỏi sai. Câu hỏi của tôi liên quan đến django-piston và tại sao Content-Type của phản hồi của tôi luôn được đặt thành văn bản thuần thay vì ứng dụng/json bất cứ khi nào phản hồi là HTTP CREATED (201). Tôi sẽ hỏi đây là một câu hỏi riêng. –

+1

Điều này cho tôi một lỗi: "NestedMultiDict không phải là json serializable" – zakdances

5

Đó là định dạng dict bằng Python dict literal format, chứ không phải JSON. Bạn có thể làm:

import ast 
result = ast.literal_eval(response[1]) 

để đọc trong phản hồi theo định dạng đó. Bạn có chắc chắn rằng Django chưa giải mã được JSON?

+2

literal_eval sẽ không hoạt động trên các đối tượng datetime. Nhưng tôi nghi ngờ bạn đúng rằng một cái gì đó khác đã phân tích nó. –

1

tôi có sử dụng json trên django, tôi sử dụng này:

import simplejson as json 
#to encode 
final= {'first':first_data,'second':second_data} 
json.dumps(final) 
#to decode this is the example from python's api 
json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')