Handling JSON Data in Python: Solving TypeError list indices must be integers not str

Dec 06, 2025 · Programming · 11 views · 7.8

Keywords: Python | JSON handling | TypeError error

Abstract: This article provides an in-depth analysis of the common TypeError list indices must be integers not str error when processing JSON data in Python. Through a practical API case study, it explores the differences between json.loads and json.dumps, proper indexing for lists and dictionaries, and correct traversal of nested data structures. Complete code examples and step-by-step explanations help developers understand error causes and master JSON data handling techniques.

Error Context and Case Analysis

In Python programming, handling JSON data is a common task, especially when interacting with APIs. Beginners often encounter the TypeError: list indices must be integers, not str error, which typically stems from insufficient understanding of data structures or incorrect function usage. This article will analyze this error through a specific case study.

Analysis of Original Code Issues

The user attempted to fetch player data from a World Cup API and print all player names. The original code was:

import urllib2
import json

url = "http://worldcup.kimonolabs.com/api/players?apikey=xxx"
json_obj = urllib2.urlopen(url).read
readable_json = json.dumps(json_obj)
playerstuff = readable_json['firstName']
for i in playerstuff:
    print i['firstName']

This code has several critical issues:

  1. Incorrect use of json.dumps: This function converts Python objects to JSON strings, not parses JSON data.
  2. Incorrect indexing: readable_json['firstName'] attempts to access a list with a string index, which is not allowed.
  3. Misunderstanding of data structure: The API returns a list containing multiple dictionaries, not a single dictionary.

Correct Solution

Based on the best answer, the correct approach is:

import urllib2
import json

url = "http://worldcup.kimonolabs.com/api/players?apikey=xxx"
# Fetch raw data
response = urllib2.urlopen(url)
json_text = response.read()

# Parse JSON string using json.loads
players_list = json.loads(json_text)

# Correctly traverse the list
for player in players_list:
    print player['firstName']

Key improvements:

Deep Understanding of Data Structures

Understanding the API response structure is crucial. According to the provided JSON example:

[
  {
    "firstName": "Nicolas Alexis Julio",
    "lastName": "N'Koulou N'Doubena",
    // ... other fields
  },
  {
    "firstName": "Alexandre Dimitri",
    "lastName": "Song-Billong",
    // ... other fields
  }
]

This is a list containing two dictionary elements. List indices must be integers (e.g., [0], [1]), while dictionary indices can be string keys (e.g., ['firstName']).

Analysis of Alternative Solution

The second answer suggests using readable_json[0]['firstName'], which fixes the error but only retrieves the first player's name. This approach is suitable when only specific index data is needed but not for traversing all data. Complete traversal should use loop structures.

Best Practices Recommendations

  1. Clarify function purposes: json.loads() for parsing, json.dumps() for serialization.
  2. Validate data structures: Use the type() function to check object types, or print the first few layers of data structures.
  3. Error handling: Add exception handling for network issues or data format errors.
  4. Use modern libraries: Consider using the requests library to simplify HTTP requests, or Python 3's urllib.

Extended Applications

After mastering these concepts, you can handle more complex JSON structures, such as nested dictionaries or lists. For example, if an API returns {"players": [...]}, you need to access the ['players'] key to get the list first, then traverse that list.

By understanding data structures and correctly using JSON processing functions, you can avoid common TypeError errors and write robust API interaction code.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.