web-dev-qa-db-ja.com

HTTPResponseオブジェクト-JSONオブジェクトは 'bytes'ではなくstrでなければなりません

小さなPythonというライブラリを libpynexmo と呼んで、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_には.read()を付けてオブジェクト(この場合はHTTPResponseオブジェクト)を渡す必要があるといくつかの場所で読みましたが、HTTPResponseオブジェクトでは機能しません。

次はどこに行けばいいか迷っていますが、1500行のスクリプト全体がPython 3に変換されたばかりなので、2.7に戻るつもりはありません。

26
Chevron

最近、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']
18
Ryan

同じ問題に直面して、私はdecode()を使用してそれを解決します

...
rawreply = connection.getresponse().read()
reply = json.loads(rawreply.decode())
47
costas

私も問題に出会い、今では合格しました

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'))
12
Du Peng

HTTPResponse を取得しているため、 Tornado.escape とそのjson_decode()を使用して、JSONストリンを辞書に変換できます。

from tornado import escape

body = escape.json_decode(body)

マニュアルから:

tornado.escape.json_decode(value)

戻り値Python指定されたJSON文字列のオブジェクト。

2
fedorqui