JSON – Iterating over dictionary throws error

Question:

I am trying to make a GET request to get a list of games by iterating over a JSON response. From the output, it looks like it was able to iterate and print everything up until teams_array = item['teams'], then it throws a TypeError.

import requests
import json
import pprint
from data.api import api


def get_nba_games():
    """Gets games schedule from requests"""
    url = "https://api-basketball.p.rapidapi.com/games"
    querystring = {"season": "2022-2023", "league": "12"}
    headers = {
        "X-RapidAPI-Key": api,
        "X-RapidAPI-Host": "api-basketball.p.rapidapi.com"
    }
    response = requests.request("GET", url, headers=headers, params=querystring)
    response_data = response.json()
    games_data = response_data['response']

    for item in games_data:
        print(item['date'])
        print(item['time'])
        print(item['timezone'])
        print(item['week'])
        teams_array = item['teams']
        for teams in teams_array:
            print(f"{teams['away']['name']} @ {teams['home']['name']}")

get_nba_games()

I first tried to use the for loop for item in response_data['response'] without the games_data variable, but it threw the same error.

Here is the output of the above code.

2022-10-02T23:00:00+00:00
23:00
UTC
None
Traceback (most recent call last):
  File "C:Usersuserpythonprojectmain.py", line 27, in <module>
    get_nba_games()
  File "C:Usersuserpythonprojectmain.py", line 25, in
get_nba_games
    print(f"{teams['away']['name']} @ {teams['home']['name']})
TypeError: string indices must be integers

Have I loaded the JSON response wrong?

Here is the sample data of the JSON

"response":[25 items
    0:{12 items
    "id":194266
    "date":"2022-10-02T23:00:00+00:00"
    "time":"23:00"
    "timestamp":1664751600
    "timezone":"UTC"
    "stage":NULL
    "week":NULL
    "status":{...}3 items
    "league":{...}5 items
    "country":{...}4 items
    "teams":{2 items
        "home":{3 items
            "id":142
            "name":"Houston Rockets"
            "logo":"https://media.apisports.io/basketball/teams/142.png"
            }
        "away":{3 items
            "id":158
            "name":"San Antonio Spurs"
            "logo":"https://media.apisports.io/basketball/teams/158.png"
            }
}

Note: There are other data that comes before the response key that I don’t need.

Asked By: Matthew Jarrett

||

Answers:

There is no teams arrray in your sample data, it’s a dictionary. Remove the for loop and just do this:

import requests
import json
import pprint
from data.api import api


def get_nba_games():
    """Gets games schedule from requests"""
    url = "https://api-basketball.p.rapidapi.com/games"
    querystring = {"season": "2022-2023", "league": "12"}
    headers = {
        "X-RapidAPI-Key": api,
        "X-RapidAPI-Host": "api-basketball.p.rapidapi.com"
    }
    response = requests.request("GET", url, headers=headers, params=querystring)
    response_data = response.json()
    games_data = response_data['response']

    for item in games_data:
        print(item['date'])
        print(item['time'])
        print(item['timezone'])
        print(item['week'])
        teams_array = item['teams']
        print(f"{teams_array['away']['name']} @ {teams_array['home']['name']}")
            

get_nba_games()
Answered By: Sam Spade

I figured it out!

Instead of making a new variable in the teams array, I changed the for loop to below:

    for item in games_data:
        print(item['date'])
        print(item['time'])
        print(item['timezone'])
        print(item['week'])
        print(f"{item['teams']['away']['name']} @ {item['teams']['home']['name']}")

I didn’t need the team_array = item['teams']

Answered By: Matthew Jarrett
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.