Intentar analizar json a partir de una url que requieren inicio de sesión. Incluyendo todo mi código aquí como no estoy seguro de dónde está el error.

try: import simplejson as json
except ImportError: import json
import urllib2

username = 'user'
password = '1234'
url = "https://www.blah.com/someplace"

# set up the username/password/url request
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_mgr.add_password(None, "https://www.blah.com", username, password)
handler = urllib2.HTTPBasicAuthHandler(password_mgr)
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
request = urllib2.Request(url)
response = opener.open(request)

# option 1
json_object = json.loads(str(response))

#option 2
json_object = json.loads(response)

Si puedo ejecutar el código con la opción 1 (comentario de la opción 2), me sale este error:

Traceback (most recent call last):
  File "jsontest.py", line 22, in <module>
    json_object = json.loads(str(request))
  File "/usr/lib/python2.7/dist-packages/simplejson/__init__.py", line 413, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/dist-packages/simplejson/decoder.py", line 402, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/dist-packages/simplejson/decoder.py", line 420, in raw_decode
    raise JSONDecodeError("No JSON object could be decoded", s, idx)
simplejson.decoder.JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0)

Si ejecuto la opción 2:

Traceback (most recent call last):
  File "jsontest.py", line 23, in <module>
    json_object = json.loads(request)
  File "/usr/lib/python2.7/dist-packages/simplejson/__init__.py", line 413, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/dist-packages/simplejson/decoder.py", line 402, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer

Mi ejemplo de JSON es válido como lo que yo puedo decir:

{«set1»:[{«data1″:»411″,»data2″:»2033″,»data3″:»1″,»data4″:»43968077″,»data5″:»217″,»data6″:»106828″,»data7»:[]}],
«set2»:{«data8″:»411″,»data9″:»2033″,»data10″:»43968077″,»data11″:»217223360″,»data12″:»106828»}}

simplejson version = 2.3.2,
Python 2.7.3

Muy nuevo en todo esto, así que cualquier punteros sería muy útil.

  • por qué estás tratando de leer el objeto de solicitud? No quieres la respuesta? respuesta = abridor.abierto(req);datos = respuesta.leer()
  • No quieres decir json_object = json.loads(response)? (no request?) Sólo un error tipográfico?
  • Ugh. Sí me refería a la respuesta. Editado.
InformationsquelleAutor acpigeon | 2012-09-07

2 Comentarios

  1. 8

    Desea decodificar el respuesta, no de la solicitud:

    json_object = json.load(response)

    La respuesta es un archivo como objeto, así que usted puede utilizar .load() tener el json de la biblioteca leerlo directamente.

    Alternativamente (en el costo de algunos temporal de uso de memoria), el uso de la .loads() función con la de leer completamente la respuesta:

    json_object = json.loads(response.read())

    Tenga en cuenta que python 2.7 ya incluye el simplejson biblioteca, cambio de nombre a json:

    import json
    • Correcto, necesitaba usar .leer() load(). La ‘respuesta’ fue un error tipográfico sí. Ahora tengo un ready-to-go py dict, gracias!
  2. 1

    Que usted necesita para utilizar la respuesta, no se lo solicita (tal vez sólo un error tipográfico?), pero además necesita utilizar response.read() para conseguir el cuerpo de la respuesta HTTP:

    json_object = json.loads(response.read())

Dejar respuesta

Please enter your comment!
Please enter your name here