Objeto HTTPResponse: el objeto JSON debe ser str, no ''bytes''
python-3.x python-3.4 (4)
Como obtiene una HTTPResponse , puede usar Tornado.escape y su json_decode()
para convertir el JSON strign en un diccionario:
from tornado import escape
body = escape.json_decode(body)
Del manual:
tornado.escape.json_decode (valor)
Devuelve objetos Python para la cadena JSON dada.
He intentado actualizar una pequeña biblioteca de Python llamada libpynexmo para que funcione con Python 3.
Me he quedado atrapado en esta función:
def send_request_json(self, request):
url = request
req = urllib.request.Request(url=url)
req.add_header(''Accept'', ''application/json'')
try:
return json.load(urllib.request.urlopen(req))
except ValueError:
return False
Cuando llega a esto, json responde con:
TypeError: the JSON object must be str, not ''bytes''
Leí en algunos lugares que para json.load
debería pasar objetos (en este caso un objeto HTTPResponse
) con un .read()
adjunto, pero no funciona en los objetos HTTPResponse
.
No sé dónde ir con esto, pero como todo mi script de 1500 líneas se acaba de convertir a Python 3, no tengo ganas de volver a 2.7.
Conocí el problema también y ahora pasa
import json
import urllib.request as ur
import urllib.parse as par
html = ur.urlopen(url).read()
print(type(html))
data = json.loads(html.decode(''utf-8''))
Enfrentando el mismo problema, lo resuelvo usando decode ()
...
rawreply = connection.getresponse().read()
reply = json.loads(rawreply.decode())
Recientemente escribí una pequeña función para enviar mensajes de Nexmo. A menos que necesite la funcionalidad completa del código libpynexmo, esto debería hacer el trabajo por usted. Y si desea continuar con la revisión de libpynexmo, simplemente copie este código. La clave es la codificación utf8.
Si desea enviar cualquier otro campo con su mensaje, la documentación completa de lo que puede incluir con un mensaje de salida nexmo está aquí
Python 3.4 probó Nexmo saliente (JSON):
def nexmo_sendsms(api_key, api_secret, sender, receiver, body):
"""
Sends a message using Nexmo.
:param api_key: Nexmo provided api key
:param api_secret: Nexmo provided secrety key
:param sender: The number used to send the message
:param receiver: The number the message is addressed to
:param body: The message body
:return: Returns the msgid received back from Nexmo after message has been sent.
"""
msg = {
''api_key'': api_key,
''api_secret'': api_secret,
''from'': sender,
''to'': receiver,
''text'': body
}
nexmo_url = ''https://rest.nexmo.com/sms/json''
data = urllib.parse.urlencode(msg)
binary_data = data.encode(''utf8'')
req = urllib.request.Request(nexmo_url, binary_data)
response = urllib.request.urlopen(req)
result = json.loads(response.readall().decode(''utf-8''))
return result[''messages''][0][''message-id'']