Обработка ошибок JSON, загруженная с помощью ‘http’ — ошибка типа: строковые индексы должны быть целыми числами

#python #json #python-3.x

#python #json #python-3.x

Вопрос:

Я пытаюсь извлечь некоторые данные из API и поместить их в базу данных, но я столкнулся с некоторыми проблемами.

Данные API: https://api.coronatracker.com/v4/analytics/newcases/country?countryCode=PLamp;startDate=2020-11-01amp;endDate=2020-11-06

Данные из вышеуказанного URL

 [
  {"country":"Poland","country_code":"PL","last_updated":"2020-11-02T00:01:00.000Z","new_deaths":92,"new_infections":15578,"new_recovered":7818},
  {"country":"Poland","country_code":"PL","last_updated":"2020-11-03T00:02:00.000Z","new_deaths":227,"new_infections":19364,"new_recovered":5573},
  {"country":"Poland","country_code":"PL","last_updated":"2020-11-04T00:00:00.000Z","new_deaths":373,"new_infections":24692,"new_recovered":8974},
  {"country":"Poland","country_code":"PL","last_updated":"2020-11-05T00:11:00.000Z","new_deaths":367,"new_infections":27143,"new_recovered":8721}
]
  

Ошибка

Date = i[‘last_updated’] Ошибка типа: строковые индексы должны быть целыми числами

Часть моего кода

 try:
    response = http.request('GET', url)
    data = json.loads(response.data.decode('utf-8'))
    index = 0

    for i in data:
        Date = None
        Confirmed = None
        Deaths = None
        Recovered = None
        #Active = None

        Date = i['last_updated']
        Confirmed = i['new_infections']
        Deaths = i['new_deaths']
        Recovered = i['new_recovered']
        #Active = i['Active']

        cur.execute("""
            INSERT INTO covid_stats_poland
            VALUES (%s, %s, %s, %s, %s); 
            """,
            (index, Date, Confirmed, Deaths, Recovered))
        conn.commit()
        index  = 1
    cur.close()
  

Может кто-нибудь, пожалуйста, объяснить, что я делаю не так / как я могу это исправить?

Ответ №1:

Ошибка, скорее всего, связана data с дополнительной информацией HTTP, такой как заголовки. См. Ниже Два стандартных подхода для извлечения JSON.

Вариант 1: urllib.request

 import json
import urllib.request 

URL = "https://api.coronatracker.com/v4/analytics/newcases/country?countryCode=PLamp;startDate=2020-11-01amp;endDate=2020-11-06"

with urllib.request.urlopen(URL) as url:
    data = json.loads(url.read().decode())
    print(data)

for i in data:
    Date = i['last_updated']
    Confirmed = i['new_infections']
    Deaths = i['new_deaths']
    Recovered = i['new_recovered']

    print(f"nDate: {Date}")
    print(f"Confirmed: {Confirmed}")
    print(f"Deaths: {Deaths}")
    print(f"Recovered: {Recovered}")
  

Вывод

 [{'country': 'Poland', 'country_code': 'PL', 'last_updated': '2020-11-02T00:01:00.000Z', 'new_deaths': 92, 'new_infections': 15578, 'new_recovered': 7818}, {'country': 'Poland', 'country_code': 'PL', 'last_updated': '2020-11-03T00:02:00.000Z', 'new_deaths': 227, 'new_infections': 19364, 'new_recovered': 5573}, {'country': 'Poland', 'country_code': 'PL', 'last_updated': '2020-11-04T00:00:00.000Z', 'new_deaths': 373, 'new_infections': 24692, 'new_recovered': 8974}, {'country': 'Poland', 'country_code': 'PL', 'last_updated': '2020-11-05T00:11:00.000Z', 'new_deaths': 367, 'new_infections': 27143, 'new_recovered': 8721}]

Date: 2020-11-02T00:01:00.000Z
Confirmed: 15578
Deaths: 92
Recovered: 7818

Date: 2020-11-03T00:02:00.000Z
Confirmed: 19364
Deaths: 227
Recovered: 5573

Date: 2020-11-04T00:00:00.000Z
Confirmed: 24692
Deaths: 373
Recovered: 8974

Date: 2020-11-05T00:11:00.000Z
Confirmed: 27143
Deaths: 367
Recovered: 8721
  

Вариант 2: http модуль (менее распространенный)

 import http
import json

URL = "api.coronatracker.com"
url_path = "/v4/analytics/newcases/country?countryCode=PLamp;startDate=2020-11-01amp;endDate=2020-11-06"

conn = http.client.HTTPSConnection(URL)
conn.request("GET", url_path)
response = conn.getresponse()
data = json.loads(response.read().decode())
print(data)

for i in data:
    Date = i['last_updated']
    Confirmed = i['new_infections']
    Deaths = i['new_deaths']
    Recovered = i['new_recovered']

    print(f"nDate: {Date}")
    print(f"Confirmed: {Confirmed}")
    print(f"Deaths: {Deaths}")
    print(f"Recovered: {Recovered}")
  

Вывод

 [{'country': 'Poland', 'country_code': 'PL', 'last_updated': '2020-11-02T00:01:00.000Z', 'new_deaths': 92, 'new_infections': 15578, 'new_recovered': 7818}, {'country': 'Poland', 'country_code': 'PL', 'last_updated': '2020-11-03T00:02:00.000Z', 'new_deaths': 227, 'new_infections': 19364, 'new_recovered': 5573}, {'country': 'Poland', 'country_code': 'PL', 'last_updated': '2020-11-04T00:00:00.000Z', 'new_deaths': 373, 'new_infections': 24692, 'new_recovered': 8974}, {'country': 'Poland', 'country_code': 'PL', 'last_updated': '2020-11-05T00:11:00.000Z', 'new_deaths': 367, 'new_infections': 27143, 'new_recovered': 8721}]

Date: 2020-11-02T00:01:00.000Z
Confirmed: 15578
Deaths: 92
Recovered: 7818

Date: 2020-11-03T00:02:00.000Z
Confirmed: 19364
Deaths: 227
Recovered: 5573

Date: 2020-11-04T00:00:00.000Z
Confirmed: 24692
Deaths: 373
Recovered: 8974

Date: 2020-11-05T00:11:00.000Z
Confirmed: 27143
Deaths: 367
Recovered: 8721
  

Комментарии:

1.Спасибо, Кристофер, работает как шарм. Также отформатировал дату сейчас Date = i['last_updated'] Date = datetime.strptime(Date, "%Y-%m-%dT%H:%M:%S.%f%z") Date = Date.strftime("%Y/%m/%d")