[Python] 讓JSON對象接受字節或讓urlopen輸出字符串



Answers

Python的美妙標準庫來拯救...

import codecs

reader = codecs.getreader("utf-8")
obj = json.load(reader(response))

適用於py2和py3。

Question

使用Python3,我正在從URL請求一個json文檔。

response = urllib.request.urlopen(request)

response像是一個類似於具有readreadline方法的對象的文件。

通常情況下,可以用文本模式打開文件來創建JSON對象。

obj = json.load(fp)

我想要做的是:

obj = json.load(response)

然而,這不起作用,因為urlopen以二進制模式返回文件對象。

解決方法當然是:

str_response = response.readall().decode('utf-8')
obj = json.loads(str_response)

但是這感覺很糟糕......

有沒有更好的方法可以將字節文件對象轉換為字符串文件對象? 或者我是否缺少urlopenjson.load任何參數以提供編碼?







對於嘗試使用requests庫來解決此問題的其他人:

import json
import requests

r = requests.get('http://localhost/index.json')
r.raise_for_status()
# works for Python2 and Python3
json.loads(r.content.decode('utf-8'))






如果您在使用燒瓶微框架時遇到此問題,則可以執行以下操作:

data = json.loads(response.get_data(as_text=True))

從文檔 :“如果as_text設置為True,返回值將是解碼的unicode字符串”






Links