我一直在尝试更新名为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。
答案 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对象。