Я написал следующий код для чтения образца данных JSON с URL-адреса,
HEADER = {"content-type": "application/josn"}
session = requests.Session()
session.verify = True
session.headers = HEADER
output = session.request("GET", "https://jsonplaceholder.typicode.com/todos/1", timeout=30)
Если я напечатаю output, я получу,
<Response [200]>
Если я сделаю,
output = session.request("GET", "https://jsonplaceholder.typicode.com/todos/1", timeout=30).json()
Я получаю актуальный контент json,
{u'completed': False, u'userId': 1, u'id': 1, u'title': u'delectus aut autem'}
Но когда я сделаю,
output = session.request("GET", "https://jsonplaceholder.typicode.com/todos/1", timeout=30)
print(json.loads(output))
Я получил,
File "/usr/lib64/python2.7/json/decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer
Может кто-нибудь дать мне пример, когда мне следует использовать .json(), а когда json.loads()?
Немного не имеет отношения к рассматриваемому вопросу, но в вашем объявлении HEADER есть опечатка: application/josn должен быть application/json.
может кто-нибудь, пожалуйста, скажите мне, почему я проиграл? При необходимости я могу добавить более подробную информацию, но, пожалуйста, оставьте хотя бы комментарий.






.json - это просто ярлык json.loads(), когда ответ представляет собой json.
print(json.loads(output))
не работает, потому что вам нужно получить тело запроса, я думаю, что это
print(json.loads(output.text))
Это правильно - output во втором примере в OP возвращает объект типа Response, который не является типом данных, который json.loads() принимает в качестве аргумента s. Фактически, единственный принятый тип данных - это str юникода (источник).
спасибо, как .json() автоматически получает output.text?
@MaverickD, потому что это метод объекта ответа
Возможный обман: TypeError: объект JSON должен быть str, а не bytes