2016-09-23 3 views
-1

Я совершенно новый с JSON. Мой код состоит в извлечении данных с веб-сайта, для которого требуется ключ API. Получив информацию. Я пытаюсь достигнуть той информации, которая закодирована в сына через этот формат (вот пример):Доступ к данным из файла JSON

[{"number":31705,"name":"31705 - CHAMPEAUX (BAGNOLET)","address":"RUE DES CHAMPEAUX (PRES DE LA GARE ROUTIERE) - 93170 BAGNOLET","latitude":48.8645278209514,"longitude":2.416170724425901},{"number":10042,"name":"10042 - POISSONNIÈRE - ENGHIEN","address":"52 RUE D'ENGHIEN/ANGLE RUE DU FAUBOURG POISSONIERE - 75010 PARIS","latitude":48.87242006305313,"longitude":2.348395236282807}] 

Как я получить доступ к различным данным в коде JSON? Это код, который я придумал:

import requests 

reponse=requests.get('https://api.jcdecaux.com/vls/v1/stations/{station_number}?contract={contract_name}&api_key HTTP/1.1') 

Я считаю, что мой запрос сформулировал ответ, который лежит в «ответ» «папка», которая была отправлена ​​на веб-сайте на мой компьютер:

print(reponse.headers) 
print(reponse(2,/'latitude') 

Я пытаюсь получить доступ к информации о рельефе в каждом элементе кода json - 2 представляет собой второй элемент списка и ширину - имя значения, которое я пытаюсь получить в элементе списка json. Но я не могу этого сделать. Ошибка, которую я получаю, является синтаксической ошибкой.

Как исправить это? Я хотел бы получить доступ ко всем значениям каждой строки каждого члена ответа объекта.

UPDATE п ° 1:

Мой новый код:

import json 
import requests 
reponse=requests.get('https://api.jcdecaux.com/vls/v1/stations/{31705}?contract={Paris}&apiKey={0617697a9795f803697de4b9abf9759d5406b3a0} HTTP/1.1') 
data = json.loads(response.content) 
print(data) 

Однако я получаю ошибку:

Traceback (most recent call last): 
    File "/Users/someone/Desktop/TIPE 2016:17/Programme TIPE 2016:2017.py", line 27, in <module> 
data = json.loads(response.content) 
    File "/Users/someone/miniconda3/lib/python3.5/json/__init__.py", line 312, in loads 
s.__class__.__name__)) 
TypeError: the JSON object must be str, not 'bytes' 

UPDATE N ° 2:

мой новый код это:

import json 
import requests 
reponse=requests.get('https://api.jcdecaux.com/vls/v1/stations/{31705}?contract={Paris}&apiKey={0617697a9795f803697de4b9abf9759d5406b3a0} HTTP/1.1') 
data = response.json() 
latitude = data[2]['latitude'] 

Однако я получаю ошибку:

Traceback (most recent call last): 
File "/Users/someone/Desktop/TIPE 2016:17/Programme TIPE 2016:2017.py", line 30, in <module> 
latitude = data[2]['latitude'] 
KeyError: 2 

Означает ли это, что ответ пуст?

ОБНОВЛЕНИЕ п ° 3:

reponse.content 

ответ следующее:

b'{ "error" : "Unauthorized" }' 

В чем проблема?

UPDATE п ° 4:

мой новый код:

reponse=requests.get('https://api.jcdecaux.com/vls/v1/stations/{31705}?contract={Paris}&apiKey={0617697a9795f803697de4b9abf9759d5406b3a0} HTTP/1.1') 

data = json.loads(response.content.decode('utf-8')) 
print(reponse.headers) 
print(reponse.content) 

результат:

{'Content-Length': '48', 'Content-Encoding': 'gzip', 'Server': 'Apache-Coyote/1.1', 'Date': 'Fri, 23 Sep 2016 19:39:25 GMT', 'Connection': 'close', 'Content-Type': 'application/json'} 
b'{ "error" : "Unauthorized" }' 

поэтому ответ на мой запрос не пуст, но у меня нет разрешение на доступ к нему. Как я могу это решить?

FINAL UPDATE:

Новый и рабочий код является:

import json 

import requests 

r = requests.get('https://api.jcdecaux.com/vls/v1/stations/31705?contract=Paris&apiKey=0617697a9795f803697de4b9abf9759d5406b3a0') 

response_json = r.json() 

print (response_json['name']) 

и результат:

31705 - CHAMPEAUX (BAGNOLET) 
+0

Что вы пытаетесь достичь с помощью 'печати (réponse (2,/'широта')', потому что ему не хватает закрывающей скобки ')' и '/ 'latitude'' аргумент странно. –

+0

Я пытаюсь получить доступ к информации о рельефе в каждом элементе кода json - 2 представляет второй элемент списка и latitude имя значения, которое я пытаюсь получить в элементе списка json. Но я не могу этого сделать. –

+0

Можете ли вы проверить, что такое значение 'response.content'? –

ответ

1

вы можете конвертировать ваши данные json в Сыроватского, а затем обращаться к нему как Словарь. Я считаю, что это должно быть что-то вроде

data = json.loads(response.content.decode('utf-8'))

+0

, он не работает, он говорит: Traceback (последний последний звонок): Файл «/ Пользователи/кто-то/Рабочий стол/TIPE 2016: 17/Program TIPE 2016: 2017.py ", строка 24, в data = json.loads (response.content) Файл" /Users/someone/miniconda3/lib/python3.5/json/__init__. py ", строка 312, в нагрузках s .__ класс __.__ name__)) TypeError: объект JSON должен быть str, а не 'bytes' –

+0

@ElliottOhayon да для этого для работы контент должен быть строкового типа. –

+0

Ваш токен авторизации не установлен.это причина, по которой вы получаете ошибку. –

0

просит имеет встроенный JSON декодер, так что нет никакой необходимости использовать библиотеку JSon:

import requests 

response = requests.get(url) 
data = response.json() 

Основываясь на данных, в вашем вопросе, " data "может быть быть списком диктонов, которые содержат широту. Таким образом, для извлечения первого может быть:

latitude = data[0]['latitude'] 

Но вы, вероятно, захотите сыграть с ответом в интерактивном режиме сначала, чтобы убедиться.

1

Вы испортили свой URL. Я не уверен, что такое HTTP/1.1 суффикс, но идентификатор определенно здесь не принадлежит. Кроме того, отключены все параметры в скрученных скобках.

import requests 
r = requests.get('https://api.jcdecaux.com/vls/v1/stations/31705?contract=Paris&apiKey=0617697a9795f803697de4b9abf9759d5406b3a0') 
response_json = r.json() 
print response_json 

Этот фрагмент кода печатает:

{u'status': u'OPEN', u'contract_name': u'Paris', u'name': u'31705 - CHAMPEAUX (BAGNOLET)', u'bonus': True, u'bike_stands': 50, u'number': 31705, u'last_update': 1474660046000, u'available_bike_stands': 49, u'banking': True, u'available_bikes': 1, u'address': u'RUE DES CHAMPEAUX (PRES DE LA GARE ROUTIERE) - 93170 BAGNOLET', u'position': {u'lat': 48.8645278209514, u'lng': 2.416170724425901}} 

Подводя итог, response_json теперь стандартный Python ДИКТ, из которого данные могут быть доступны с использованием стандартного протокола Dict.

print response_json['status'] # prints OPEN 

 Смежные вопросы

  • Нет связанных вопросов^_^