26

Python 3 で動作するように、libpynexmoという小さな Python ライブラリを更新しようとしています。

私はこの機能にこだわっています:

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

4 に答える 4

47

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

...
rawreply = connection.getresponse().read()
reply = json.loads(rawreply.decode())
于 2014-07-01T18:41:48.240 に答える
13

私も問題に遭遇しましたが、今は合格です

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'))
于 2015-12-27T15:27:33.573 に答える
3

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

from tornado import escape

body = escape.json_decode(body)

マニュアルから:

tornado.escape.json_decode(値)

指定された JSON 文字列の Python オブジェクトを返します。

于 2016-03-23T12:29:09.457 に答える