Looping nested JSON object in python to collect selected fields and save to use in another request

Question:

I am trying to iterate the response from a API call but having issues collecting all the data.

I need to use the IDs with another requests call so I can get access to individual race data.

This is the code so far:

import requests
import json

def event_id_collection():
# MAKE VARIABLES GLOBAL

    link = 'https://xxxxxxxx.com.au/GroupedRaceCard?format=json' 
    # Request data from link as 'str'
    data = requests.get(link).text
    # convert 'str' to Json
    data = json.loads(data)

    # JSON PARSE
    for races in data['Thoroughbred'][0]:
        race_id = races['EventId']
        venue = races['Venue']
        race_no = races['RaceNumber']


        print(race_id, venue, race_no)

if __name__ == "__main__":
    event_id_collection() 

This code returns

12085859 Randwick 1
12085861 Randwick 2
12085863 Randwick 3
12085865 Randwick 4
12085867 Randwick 5
12085869 Randwick 6
12085871 Randwick 7
12085873 Randwick 8
12085875 Randwick 9
12085877 Randwick 10

so that works ok, but I need to loop through all race meetings for the day.

[‘Thoroughbred’][0] <—- can I use a wildcard for the 0? so it loops all the race meetings? The number of races changes each day, so it can’t be any set number.

when i try to use the same code with out the [0] i get the following error

race_id = races['EventId']
TypeError: list indices must be integers or slices, not str

This is the JSON response (not all of it, just what could fit here) from the API request:

    "Thoroughbred": [
        [
            {
                "EventTypeId": 1,
                "EventId": 12085859,
                "VenueId": 130,
                "Venue": "Randwick",
                "CountryCode": "AUS",
                "RaceNumber": 1,
                "AdvertisedStartTime": "2022-10-01T01:50:00.0000000Z",
                "ResultStatusId": 2,
                "SecondsToJump": -11575,
                "HasFixedMarkets": true,
                "IsOpenForBetting": false,
                "MarketShortcuts": [],
                "Results": "1,5,7,6",
                "MasterCategoryName": "Australian Racing",
                "EventName": "Arrowfield Breeders' Plate",
                "StateCode": "NSW"
            },
            {
                "EventTypeId": 1,
                "EventId": 12085861,
                "VenueId": 130,
                "Venue": "Randwick",
                "CountryCode": "AUS",
                "RaceNumber": 2,
                "AdvertisedStartTime": "2022-10-01T02:25:00.0000000Z",
                "ResultStatusId": 2,
                "SecondsToJump": -9475,
                "HasFixedMarkets": true,
                "IsOpenForBetting": false,
                "MarketShortcuts": [],
                "Results": "8,7,3,1",
                "MasterCategoryName": "Australian Racing",
                "EventName": "Keeneland Gimcrack Stakes",
                "StateCode": "NSW"
            },
            {
                "EventTypeId": 1,
                "EventId": 12085863,
                "VenueId": 130,
                "Venue": "Randwick",
                "CountryCode": "AUS",
                "RaceNumber": 3,
                "AdvertisedStartTime": "2022-10-01T03:00:00.0000000Z",
                "ResultStatusId": 2,
                "SecondsToJump": -7375,
                "HasFixedMarkets": true,
                "IsOpenForBetting": false,
                "MarketShortcuts": [],
                "Results": "2,6,7,14",
                "MasterCategoryName": "Australian Racing",
                "EventName": "Schweppes (Bm88)",
                "StateCode": "NSW"
            },
            {
                "EventTypeId": 1,
                "EventId": 12085865,
                "VenueId": 130,
                "Venue": "Randwick",
                "CountryCode": "AUS",
                "RaceNumber": 4,
                "AdvertisedStartTime": "2022-10-01T03:35:00.0000000Z",
                "ResultStatusId": 2,
                "SecondsToJump": -5275,
                "HasFixedMarkets": true,
                "IsOpenForBetting": false,
                "MarketShortcuts": [],
                "Results": "1,2,8,4",
                "MasterCategoryName": "Australian Racing",
                "EventName": "Fujitsu General Hill Stakes",
                "StateCode": "NSW"
            },
            {
                "EventTypeId": 1,
                "EventId": 12085867,
                "VenueId": 130,
                "Venue": "Randwick",
                "CountryCode": "AUS",
                "RaceNumber": 5,
                "AdvertisedStartTime": "2022-10-01T04:10:00.0000000Z",
                "ResultStatusId": 2,
                "SecondsToJump": -3175,
                "HasFixedMarkets": true,
                "IsOpenForBetting": false,
                "MarketShortcuts": [],
                "Results": "1,4,12,2",
                "MasterCategoryName": "Australian Racing",
                "EventName": "Drinkwise Dulcify Stakes",
                "StateCode": "NSW"
            },
            {
                "EventTypeId": 1,
                "EventId": 12085869,
                "VenueId": 130,
                "Venue": "Randwick",
                "CountryCode": "AUS",
                "RaceNumber": 6,
                "AdvertisedStartTime": "2022-10-01T04:45:00.0000000Z",
                "ResultStatusId": 2,
                "SecondsToJump": -1075,
                "HasFixedMarkets": true,
                "IsOpenForBetting": false,
                "MarketShortcuts": [],
                "Results": "3,2,4,1",
                "MasterCategoryName": "Australian Racing",
                "EventName": "Darley Flight Stakes",
                "StateCode": "NSW"
            },
            {
                "EventTypeId": 1,
                "EventId": 12085871,
                "VenueId": 130,
                "Venue": "Randwick",
                "CountryCode": "AUS",
                "RaceNumber": 7,
                "AdvertisedStartTime": "2022-10-01T05:25:00.0000000Z",
                "ResultStatusId": 0,
                "SecondsToJump": 1324,
                "HasFixedMarkets": true,
                "IsOpenForBetting": true,
                "MarketShortcuts": [
                    {
                        "MarketType": "RC-QUADDIE",
                        "DividendType": "VIC",
                        "EventMultipleId": 2361145,
                        "IsSelected": false,
                        "EventTypeId": 0,
                        "LegNumber": 1
                    }
                ],
                "Results": "",
                "MasterCategoryName": "Australian Racing",
                "EventName": "Bisley Workwear Premiere Stks",
                "StateCode": "NSW"
            },
            {
                "EventTypeId": 1,
                "EventId": 12085873,
                "VenueId": 130,
                "Venue": "Randwick",
                "CountryCode": "AUS",
                "RaceNumber": 8,
                "AdvertisedStartTime": "2022-10-01T06:05:00.0000000Z",
                "ResultStatusId": 0,
                "SecondsToJump": 3724,
                "HasFixedMarkets": true,
                "IsOpenForBetting": true,
                "MarketShortcuts": [
                    {
                        "MarketType": "RC-QUADDIE",
                        "DividendType": "VIC",
                        "EventMultipleId": 2361145,
                        "IsSelected": false,
                        "EventTypeId": 0,
                        "LegNumber": 2
                    },
                    {
                        "MarketType": "RC-DBL",
                        "DividendType": "VIC",
                        "EventMultipleId": 2361146,
                        "IsSelected": false,
                        "EventTypeId": 0,
                        "LegNumber": 1
                    }
                ],
                "Results": "",
                "MasterCategoryName": "Australian Racing",
                "EventName": "Tab Epsom",
                "StateCode": "NSW"
            },
            {
                "EventTypeId": 1,
                "EventId": 12085875,
                "VenueId": 130,
                "Venue": "Randwick",
                "CountryCode": "AUS",
                "RaceNumber": 9,
                "AdvertisedStartTime": "2022-10-01T06:45:00.0000000Z",
                "ResultStatusId": 0,
                "SecondsToJump": 6124,
                "HasFixedMarkets": true,
                "IsOpenForBetting": true,
                "MarketShortcuts": [
                    {
                        "MarketType": "RC-QUADDIE",
                        "DividendType": "VIC",
                        "EventMultipleId": 2361145,
                        "IsSelected": false,
                        "EventTypeId": 0,
                        "LegNumber": 3
                    }
                ],
                "Results": "",
                "MasterCategoryName": "Australian Racing",
                "EventName": "Furphy Metropolitan",
                "StateCode": "NSW"
            },
            {
                "EventTypeId": 1,
                "EventId": 12085877,
                "VenueId": 130,
                "Venue": "Randwick",
                "CountryCode": "AUS",
                "RaceNumber": 10,
                "AdvertisedStartTime": "2022-10-01T07:25:00.0000000Z",
                "ResultStatusId": 0,
                "SecondsToJump": 8524,
                "HasFixedMarkets": true,
                "IsOpenForBetting": true,
                "MarketShortcuts": [
                    {
                        "MarketType": "RC-QUADDIE",
                        "DividendType": "VIC",
                        "EventMultipleId": 2361145,
                        "IsSelected": false,
                        "EventTypeId": 0,
                        "LegNumber": 4
                    },
                    {
                        "MarketType": "RC-DBL",
                        "DividendType": "VIC",
                        "EventMultipleId": 2361146,
                        "IsSelected": false,
                        "EventTypeId": 0,
                        "LegNumber": 2
                    }
                ],
                "Results": "",
                "MasterCategoryName": "Australian Racing",
                "EventName": "Cleanaway (Bm94)",
                "StateCode": "NSW"
            }
        ],
        [
            {
                "EventTypeId": 1,
                "EventId": 12085960,
                "VenueId": 356,
                "Venue": "Flemington",
                "CountryCode": "AUS",
                "RaceNumber": 1,
                "AdvertisedStartTime": "2022-10-01T02:40:00.0000000Z",
                "ResultStatusId": 2,
                "SecondsToJump": -8575,
                "HasFixedMarkets": true,
                "IsOpenForBetting": false,
                "MarketShortcuts": [],
                "Results": "7,9,10,2",
                "MasterCategoryName": "Australian Racing",
                "EventName": "Darley Maribyrnong Trial Stks",
                "StateCode": "VIC"
            },
            {
                "EventTypeId": 1,
                "EventId": 12085993,
                "VenueId": 356,
                "Venue": "Flemington",
                "CountryCode": "AUS",
                "RaceNumber": 2,
                "AdvertisedStartTime": "2022-10-01T03:15:00.0000000Z",
                "ResultStatusId": 2,
                "SecondsToJump": -6475,
                "HasFixedMarkets": true,
                "IsOpenForBetting": false,
                "MarketShortcuts": [],
                "Results": "7,11,9,2",
                "MasterCategoryName": "Australian Racing",
                "EventName": "Katherine Bourke Paris Lane",
                "StateCode": "VIC"
            },
            {
                "EventTypeId": 1,
                "EventId": 12086003,
                "VenueId": 356,
                "Venue": "Flemington",
                "CountryCode": "AUS",
                "RaceNumber": 3,
                "AdvertisedStartTime": "2022-10-01T03:50:00.0000000Z",
                "ResultStatusId": 2,
                "SecondsToJump": -4375,
                "HasFixedMarkets": true,
                "IsOpenForBetting": false,
                "MarketShortcuts": [],
                "Results": "1,8,10,3",
                "MasterCategoryName": "Australian Racing",
                "EventName": "Tab Edward Manifold Stakes",
                "StateCode": "VIC"
            },
            {
                "EventTypeId": 1,
                "EventId": 12086005,
                "VenueId": 356,
                "Venue": "Flemington",
                "CountryCode": "AUS",
                "RaceNumber": 4,
                "AdvertisedStartTime": "2022-10-01T04:25:00.0000000Z",
                "ResultStatusId": 2,
                "SecondsToJump": -2275,
                "HasFixedMarkets": true,
                "IsOpenForBetting": false,
                "MarketShortcuts": [
                    {
                        "MarketType": "RC-GIANT6",
                        "DividendType": "VIC",
                        "EventMultipleId": 2361130,
                        "IsSelected": false,
                        "EventTypeId": 0,
                        "LegNumber": 1
                    }
                ],
                "Results": "8,5,7,4",
                "MasterCategoryName": "Australian Racing",
                "EventName": "Furphy Rose Of Kingston Stakes",
                "StateCode": "VIC"
            },
            {
                "EventTypeId": 1,
                "EventId": 12086007,
                "VenueId": 356,
                "Venue": "Flemington",
                "CountryCode": "AUS",
                "RaceNumber": 5,
                "AdvertisedStartTime": "2022-10-01T05:05:00.0000000Z",
                "ResultStatusId": 0,
                "SecondsToJump": 124,
                "HasFixedMarkets": true,
                "IsOpenForBetting": true,
                "MarketShortcuts": [
                    {
                        "MarketType": "RC-GIANT6",
                        "DividendType": "VIC",
                        "EventMultipleId": 2361130,
                        "IsSelected": false,
                        "EventTypeId": 0,
                        "LegNumber": 2
                    }
                ],
                "Results": "",
                "MasterCategoryName": "Australian Racing",
                "EventName": "Hq Tavern Danehill Stakes",
                "StateCode": "VIC"
            },
            {
                "EventTypeId": 1,
                "EventId": 12086009,
                "VenueId": 356,
                "Venue": "Flemington",
                "CountryCode": "AUS",
                "RaceNumber": 6,
                "AdvertisedStartTime": "2022-10-01T05:45:00.0000000Z",
                "ResultStatusId": 0,
                "SecondsToJump": 2524,
                "HasFixedMarkets": true,
                "IsOpenForBetting": true,
                "MarketShortcuts": [
                    {
                        "MarketType": "RC-GIANT6",
                        "DividendType": "VIC",
                        "EventMultipleId": 2361130,
                        "IsSelected": false,
                        "EventTypeId": 0,
                        "LegNumber": 3
                    },
                    {
                        "MarketType": "RC-QUADDIE",
                        "DividendType": "VIC",
                        "EventMultipleId": 2361133,
                        "IsSelected": false,
                        "EventTypeId": 0,
                        "LegNumber": 1
                    }
                ],
                "Results": "",
                "MasterCategoryName": "Australian Racing",
                "EventName": "The Lexus Bart Cummings",
                "StateCode": "VIC"
            },
            {
                "EventTypeId": 1,
                "EventId": 12086011,
                "VenueId": 356,
                "Venue": "Flemington",
                "CountryCode": "AUS",
                "RaceNumber": 7,
                "AdvertisedStartTime": "2022-10-01T06:25:00.0000000Z",
                "ResultStatusId": 0,
                "SecondsToJump": 4924,
                "HasFixedMarkets": true,
                "IsOpenForBetting": true,
                "MarketShortcuts": [
                    {
                        "MarketType": "RC-GIANT6",
                        "DividendType": "VIC",
                        "EventMultipleId": 2361130,
                        "IsSelected": false,
                        "EventTypeId": 0,
                        "LegNumber": 4
                    },
                    {
                        "MarketType": "RC-DBL",
                        "DividendType": "VIC",
                        "EventMultipleId": 2361134,
                        "IsSelected": false,
                        "EventTypeId": 0,
                        "LegNumber": 1
                    },
                    {
                        "MarketType": "RC-QUADDIE",
                        "DividendType": "VIC",
                        "EventMultipleId": 2361133,
                        "IsSelected": false,
                        "EventTypeId": 0,
                        "LegNumber": 2
                    }
                ],
                "Results": "",
                "MasterCategoryName": "Australian Racing",
                "EventName": "Tab Turnbull Stakes",
                "StateCode": "VIC"
            },
            {
                "EventTypeId": 1,
                "EventId": 12086013,
                "VenueId": 356,
                "Venue": "Flemington",
                "CountryCode": "AUS",
                "RaceNumber": 8,
                "AdvertisedStartTime": "2022-10-01T07:05:00.0000000Z",
                "ResultStatusId": 0,
                "SecondsToJump": 7324,
                "HasFixedMarkets": true,
                "IsOpenForBetting": true,
                "MarketShortcuts": [
                    {
                        "MarketType": "RC-GIANT6",
                        "DividendType": "VIC",
                        "EventMultipleId": 2361130,
                        "IsSelected": false,
                        "EventTypeId": 0,
                        "LegNumber": 5
                    },
                    {
                        "MarketType": "RC-QUADDIE",
                        "DividendType": "VIC",
                        "EventMultipleId": 2361133,
                        "IsSelected": false,
                        "EventTypeId": 0,
                        "LegNumber": 3
                    }
                ],
                "Results": "",
                "MasterCategoryName": "Australian Racing",
                "EventName": "Gilgai Stakes",
                "StateCode": "VIC"
            },

    ]
} 

this image shows the full object and all of the levels.

enter image description here

Asked By: DrewS

||

Answers:

Could you be looking for a nested loop:

import requests
import json

def event_id_collection():
# MAKE VARIABLES GLOBAL

    link = 'https://xxxxxxxx.com.au/GroupedRaceCard?format=json' 
    # Request data from link as 'str'
    data = requests.get(link).text
    # convert 'str' to Json
    data = json.loads(data)

    # JSON PARSE
    for same_venue_races in data['Thoroughbred']:
        for race in same_venue_races:
            race_id = race['EventId']
            venue = race['Venue']
            race_no = race['RaceNumber']


            print(race_id, venue, race_no)

if __name__ == "__main__":
    event_id_collection() 

Answered By: fmagno

The response is a list containing other lists. You need a nested loop to iterate the entire response.

for venue in data['Thoroughbred']:
    for race in venue:
        race_id = race['EventId']
        venue = race['Venue']
        race_no = race['RaceNumber']

        print(race_id, venue, race_no)
Answered By: Evan Logsdon

You’ll need a nested loop to process all the values. Something like:

for meet_type in data:
    print(meet_type)
    for meeting in data[meet_type]:
        print(f"{meeting[0]['MasterCategoryName']} ({meeting[0]['StateCode']})")
        for races in meeting:
            race_id = races['EventId']
            venue = races['Venue']
            race_no = races['RaceNumber']
            print(race_id, venue, race_no)

Output (for the JSON in your question):

Thoroughbred
Australian Racing (NSW)
12085859 Randwick 1
12085861 Randwick 2
12085863 Randwick 3
12085865 Randwick 4
12085867 Randwick 5
12085869 Randwick 6
12085871 Randwick 7
12085873 Randwick 8
12085875 Randwick 9
12085877 Randwick 10
Australian Racing (VIC)
12085960 Flemington 1
12085993 Flemington 2
12086003 Flemington 3
12086005 Flemington 4
12086007 Flemington 5
12086009 Flemington 6
12086011 Flemington 7
12086013 Flemington 8
Answered By: Nick
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.