HTTPResponse对象 - JSON对象必须是str,而不是' bytes'

时间:2014-06-05 19:59:29

标签: json python-3.x python-3.4 nexmo

我一直在尝试更新名为libpynexmo的小型Python库以使用Python 3。

我一直坚持这个功能:

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

当它到达时,json回复:

TypeError: the JSON object must be str, not 'bytes'

我在一些地方读到,对于json.load,你应该传递一个附加了HTTPResponse的对象(在这种情况下是一个.read()个对象),但它不会起作用HTTPResponse个对象。

我不知道下一步该怎么做,但由于我的整个1500行脚本刚刚转换为Python 3,我不想回到2.7。

4 个答案:

答案 0 :(得分:47)

面对同样的问题,我使用decode()

解决了这个问题
...
rawreply = connection.getresponse().read()
reply = json.loads(rawreply.decode())

答案 1 :(得分:18)

我最近写了一个小函数来发送Nexmo消息。除非您需要libpynexmo代码的完整功能,否则这应该可以帮到您。如果您想继续检修libpynexmo,只需复制此代码即可。关键是utf8编码。

如果您想发送包含邮件的任何其他字段,请参阅nexmo出站邮件is here

所包含的内容的完整文档

Python 3.4测试Nexmo出站(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']

答案 2 :(得分:12)

我也遇到了这个问题,现在通过了

getLine1Number()

答案 3 :(得分:2)

由于您获得了HTTPResponse,因此可以使用Tornado.escape及其json_decode()将JSON标记转换为字典:

from tornado import escape

body = escape.json_decode(body)

从手册:

  

tornado.escape.json_decode(值)

     

返回给定JSON字符串的Python对象。