2012-01-05 18 views
6

Aquí es la cadena de ejemplo que estoy recibiendo de uno de los servicios web,¿Cómo convertir datos de cadena a un objeto JSON en 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 

Aquí está el código,

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

Ahora, cuando que los puestos de servicios web los datos anteriores, ¿cómo lo convierto a formato legible? Entonces, necesito convertirlo a objeto JSON y usarlo más. Entonces, ¿cómo lo convertiré?

Cuando trato de este código,

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

Me da un error,

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 

Dónde estoy haciendo mal ??

Gracias de antemano.

Respuesta

10

Primero debe Unquote el cuerpo

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) 

A continuación, sólo cargar el JSON como normal

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

¡Muchas gracias! Funcionó. –

+0

¡SÍ! Esto puede haber resuelto todos mis problemas JSON a Python –

7

que necesita para unescape la cadena de consulta en primer lugar utilizando urllib.unquote()

import urllib 

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

entonces puede usar json.loads para convertirlo en JSON.

json_data = json.loads(unescaped) 
+0

Gracias! Funcionó ... :) –

1

Python 3 urllib unquote movimiento para analizar:

from urllib import parse 
parse.unquote(web.data()) 
Cuestiones relacionadas