Позвольте объекту JSON принимать байты или позволить выводить строки urlopen - PullRequest
175 голосов
/ 28 июля 2011

В Python 3 я запрашиваю документ json с URL.

response = urllib.request.urlopen(request)

Объект response является файловым объектом с методами read и readline. Обычно объект JSON можно создать с помощью файла, открытого в текстовом режиме.

obj = json.load(fp)

Я хотел бы сделать следующее:

obj = json.load(response)

Это, однако, не работает, так как urlopen возвращает объект файла в двоичном режиме.

Обойти это, конечно:

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

но это плохо ...

Есть ли лучший способ, которым я могу преобразовать объект файла байтов в объект файла строки? Или я пропускаю какие-либо параметры для urlopen или json.load для кодирования?

Ответы [ 11 ]

0 голосов
/ 14 февраля 2018

Я использовал нижеприведенную программу для использования json.loads()

import urllib.request
import json
endpoint = 'https://maps.googleapis.com/maps/api/directions/json?'
api_key = 'AIzaSyABbKiwfzv9vLBR_kCuhO7w13Kseu68lr0'
origin = input('where are you ?').replace(' ','+')
destination = input('where do u want to go').replace(' ','+')
nav_request = 'origin={}&destination={}&key={}'.format(origin,destination,api_key)
request = endpoint + nav_request
response = urllib.request.urlopen(request).read().decode('utf-8')
directions = json.loads(response)
print(directions)
...