2012-01-05 73 views
6

Đây là chuỗi mẫu tôi đang nhận được từ một trong những dịch vụ web,Làm thế nào để chuyển đổi dữ liệu chuỗi thành đối tượng JSON trong python?

body=%7B%22type%22%3A%22change%22%2C%22url%22%3A%22http%3A%2F%2Fapi.pachube.com%2Fv2%2Ftriggers%2F4100%22%2C%22environment%22%3A%7B%22feed%22%3A%22http%3A%2F%2Fapi.pachube.com%2Fv2%2Ffeeds%2F36133%22%2C%22title%22%3A%22Current+Cost+Bridge%22%2C%22description%22%3Anull%2C%22id%22%3A36133%7D%2C%22threshold_value%22%3Anull%2C%22timestamp%22%3A%222012-01-05T09%3A27%3A01Z%22%2C%22triggering_datastream%22%3A%7B%22url%22%3A%22http%3A%2F%2Fapi.pachube.com%2Fv2%2Ffeeds%2F36133%2Fdatastreams%2F1%22%2C%22value%22%3A%7B%22value%22%3A%22523%22%2C%22max_value%22%3A1269.0%2C%22min_value%22%3A0.0%7D%2C%22id%22%3A%221%22%2C%22units%22%3A%7B%22symbol%22%3A%22W%22%2C%22type%22%3A%22derivedUnits%22%2C%22label%22%3A%22watts%22%7D%7D%2C%22id%22%3A4100%7D 

Đây là mã,

class Feeds(): 
    def GET(self): 
     print "Get request is accepted." 
     return render.index(None) 

    def POST(self): 
     print "Post request is accepted." 
     print (web.data()) 

Bây giờ khi mà bài viết web-dịch vụ dữ liệu đưa ra ở trên, sẽ như thế nào tôi chuyển đổi nó sang định dạng có thể đọc được? Sau đó, tôi cần phải chuyển đổi nó thành đối tượng JSON và sử dụng thêm. Vì vậy, làm thế nào tôi sẽ chuyển đổi nó?

Khi tôi cố gắng mã này,

 json_data = json.loads(web.data()) 
     print json_data['body'] 
     return render.index(json_data['body']) 

Nó mang lại cho tôi một lỗi,

enter code Traceback (most recent call last): 
File "/usr/local/lib/python2.6/dist-packages/web/application.py", line 237, in process 
return self.handle() 
File "/usr/local/lib/python2.6/dist-packages/web/application.py", line 228, in handle 
return self._delegate(fn, self.fvars, args) 
File "/usr/local/lib/python2.6/dist-packages/web/application.py", line 409, in _delegate 
return handle_class(cls) 
File "/usr/local/lib/python2.6/dist-packages/web/application.py", line 385, in  handle_class 
return tocall(*args) 
File "/home/ubuntu/pachubeConsumer/src/controllers/feeds.py", line 17, in POST 
json_data = json.loads(web.data()) 
File "/usr/lib/python2.6/json/__init__.py", line 307, in loads 
return _default_decoder.decode(s) 
File "/usr/lib/python2.6/json/decoder.py", line 319, in decode 
obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
File "/usr/lib/python2.6/json/decoder.py", line 338, in raw_decode 
raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded here 

đâu Am I Going vậy ??

Xin cảm ơn trước.

Trả lời

10

Trước tiên, bạn cần phải unquote cơ thể

import urllib 
body="%7B%22type%22%3A%22change%22%2C%22url%22%3A%22http%3A%2F%2Fapi.pachube.com%2Fv2%2Ftriggers%2F4100%22%2C%22environment%22%3A%7B%22feed%22%3A%22http%3A%2F%2Fapi.pachube.com%2Fv2%2Ffeeds%2F36133%22%2C%22title%22%3A%22Current+Cost+Bridge%22%2C%22description%22%3Anull%2C%22id%22%3A36133%7D%2C%22threshold_value%22%3Anull%2C%22timestamp%22%3A%222012-01-05T09%3A27%3A01Z%22%2C%22triggering_datastream%22%3A%7B%22url%22%3A%22http%3A%2F%2Fapi.pachube.com%2Fv2%2Ffeeds%2F36133%2Fdatastreams%2F1%22%2C%22value%22%3A%7B%22value%22%3A%22523%22%2C%22max_value%22%3A1269.0%2C%22min_value%22%3A0.0%7D%2C%22id%22%3A%221%22%2C%22units%22%3A%7B%22symbol%22%3A%22W%22%2C%22type%22%3A%22derivedUnits%22%2C%22label%22%3A%22watts%22%7D%7D%2C%22id%22%3A4100%7D" 
unquoted = urllib.unquote(body) 

Sau đó chỉ cần nạp JSON như bình thường

import json 
pythonDict = json.loads(unquoted) 
+1

Cảm ơn rất nhiều! Nó đã làm việc. –

+0

CÓ! Điều này có thể vừa giải quyết tất cả các vấn đề JSON của tôi với Python –

7

bạn cần để không dò tìm chuỗi truy vấn đầu tiên sử dụng urllib.unquote()

import urllib 

unescaped = urllib.unquote(web.data()) 

sau đó bạn có thể sử dụng json.loads để chuyển đổi nó thành json.

json_data = json.loads(unescaped) 
+0

Cảm ơn! Nó hoạt động ... :) –

1

Python 3 urllib unquote chuyển sang phân tích:

from urllib import parse 
parse.unquote(web.data()) 
Các vấn đề liên quan