How to Read a JSON File in Python
What you’ll build or solve
You’ll read a JSON file from disk and turn it into Python data like dicts and lists.
When this approach works best
Reading a JSON file works well when you:
Learn Python on Mimo
- Load app settings like feature flags, UI preferences, or environment-specific config.
- Process exported data, like a list of users, products, or events saved as JSON.
- Build small utilities that read structured input for reporting or automation.
Skip this approach if the file is extremely large, and you only need a tiny slice of it. A streaming parser or a different storage format may fit better.
Prerequisites
- Python 3 installed
- You know what JSON looks like, objects and arrays
- Your file contains valid JSON, double quotes, no trailing commas, no comments
Step-by-step instructions
1) Load JSON from a file
Use the built-in json module.
Option A (most common): json.load() reads from a file object
Option B: json.loads() parses a string
importjson
frompathlibimportPath
# Option A: Load directly from a file object
withopen("data.json","r",encoding="utf-8")asf:
data=json.load(f)
# Option B: Load from a string you already have
text=Path("data.json").read_text(encoding="utf-8")
data=json.loads(text)
What to look for: json.load() reads from a file object, json.loads() parses a string.
If you’re dealing with folders and want portable paths across operating systems, see Example 2.
2) Access the data safely
First, confirm what you loaded. JSON at the top level is usually a dict or a list.
ifisinstance(data,dict):
print("Top-level keys:",list(data.keys()))
elifisinstance(data,list):
print("Top-level list length:",len(data))
Then access values in a way that matches the shape.
If data is a dict:
project=data.get("project","unknown")
max_retries=data.get("max_retries",0)
print(project,max_retries)
If you need a nested value but some keys may be missing, chain .get() with a default dict:
metrics=data.get("metrics", {})
signups=metrics.get("signups",0)
print(signups)
3) Handle JSON errors
Two errors show up most often:
FileNotFoundErrorwhen the path is wrongjson.JSONDecodeErrorwhen the file is not valid JSON
Python
importjson
fromjsonimportJSONDecodeError
frompathlibimportPath
path=Path("data.json")
try:
withpath.open("r",encoding="utf-8")asf:
data=json.load(f)
exceptFileNotFoundError:
print(f"File not found:{path.resolve()}")
exceptJSONDecodeErrorase:
print("Invalid JSON.")
print(f"Line{e.lineno}, column{e.colno}:{e.msg}")
else:
print("Loaded JSON successfully.")
What to look for: The line and column in JSONDecodeError usually point to a missing quote, extra comma, or another formatting issue.
Examples you can copy
Example 1: Read a simple config file
config.json:
JSON
{
"debug":false,
"base_url":"https://example.com",
"max_retries":3
}
Python:
importjson
frompathlibimportPath
config=json.loads(Path("config.json").read_text(encoding="utf-8"))
debug=config.get("debug",False)
base_url=config.get("base_url","https://example.com")
max_retries=config.get("max_retries",0)
print(debug)
print(base_url)
print(max_retries)
Example 2: Read JSON from a file in a subfolder
This helps when your script and your JSON file live in different folders.
importjson
frompathlibimportPath
# Folder structure example:
# project/
# app.py
# data/
# users.json
path=Path(__file__).parent/"data"/"users.json"
withpath.open("r",encoding="utf-8")asf:
users=json.load(f)
print(len(users))
What to look for: Path(__file__).parent anchors the path to the script’s location, not your current terminal folder.
Example 3: Read a list of records and loop through it
users.json:
CSS
[
{"name":"Amina", "role":"admin"},
{"name":"Luka", "role":"editor"},
{"name":"Noor", "role":"viewer"}
]
Python:
Python
importjson
withopen("users.json","r",encoding="utf-8")asf:
users=json.load(f)
foruserinusers:
print(f'{user["name"]} ->{user["role"]}')
Example 4: Read nested JSON and pull out a few values
report.json:
JSON
{
"run_id":"2026-02-16T10:15:00Z",
"metrics": {
"signups":128,
"paid_conversions":14
},
"top_sources": ["search","referral","email"]
}
Python:
importjson
frompathlibimportPath
report=json.loads(Path("report.json").read_text(encoding="utf-8"))
run_id=report["run_id"]
signups=report["metrics"]["signups"]
top_source=report["top_sources"][0]
print(run_id)
print(signups)
print(top_source)
Common mistakes and how to fix them
Mistake 1: Reading the file as text and treating it like a dict
What you might do:
withopen("data.json","r",encoding="utf-8")asf:
data=f.read()
print(data["project"])
Why it breaks: f.read() returns a string, so data["project"] does not make sense.
Correct approach:
importjson
withopen("data.json","r",encoding="utf-8")asf:
data=json.load(f)
print(data["project"])
Mistake 2: Using JSON-like syntax that JSON doesn’t allow
What you might write (invalid JSON):
{ 'project': 'demo', 'max_retries':3, }
Why it breaks: JSON requires double quotes, and trailing commas are not allowed.
Correct JSON:
JSON
{
"project":"demo",
"max_retries":3
}
Then load it:
importjson
withopen("data.json","r",encoding="utf-8")asf:
data=json.load(f)
print(data)
Troubleshooting
If you see FileNotFoundError, print the resolved path and confirm the file exists there:
frompathlibimportPath
print(Path("data.json").resolve())
If you see json.JSONDecodeError, go to the line and column shown, then look for a missing quote, an extra comma, or a comment.
If you see UnicodeDecodeError, the file may not be UTF-8. Try a different encoding that matches the source:
frompathlibimportPath
text=Path("data.json").read_text(encoding="cp1252")
If you see KeyError, print the keys you actually have, then update your key name or use .get() with a default:
print(list(data.keys()))
If you see TypeError: list indices must be integers, your top-level JSON is a list, not a dict. Loop through it or use an index like data[0].
Quick recap
- Load the file with
json.load()or read text and parse withjson.loads(). - Check if the top-level data is a dict or a list before accessing values.
- Use
.get()and default values when keys might be missing. - Catch
FileNotFoundErrorfor bad paths andJSONDecodeErrorfor invalid JSON. - Use the error’s line and column to locate formatting problems quickly.
Join 35M+ people learning for free on Mimo
4.8 out of 5 across 1M+ reviews
Check us out on Apple AppStore, Google Play Store, and Trustpilot