Working With JSON in Python
SkillVeris Team
Engineering Team

Python's built-in json module converts between JSON text and Python objects like dictionaries and lists — no installation needed.
In this guide, you'll learn:
- Four functions do almost everything: loads and dumps work with strings, load and dump work with files.
- JSON objects map to Python dictionaries and JSON arrays map to Python lists, making the data feel native.
- Use indent for readable output and sort_keys for deterministic files, both passed to dumps and dump.
- Handle non-standard types like datetime with a custom default function, since JSON only supports a fixed set of types.
1Working With JSON in Python
JSON, or JavaScript Object Notation, is a lightweight text format for storing and exchanging data, and Python handles it with the built-in json module — no installation required. The module converts between JSON text and native Python objects, so a JSON object becomes a dictionary and a JSON array becomes a list.
This mapping is what makes JSON so pleasant in Python: once parsed, the data behaves exactly like the dictionaries and lists you already know. JSON is the format behind most web APIs, config files, and data-interchange between services, so knowing the json module is essential.
- import json
- text = '{"name": "Ava", "age": 29}'
- data = json.loads(text) # -> a Python dict
- print(data['name']) # Ava
2The Four Core Functions
The json module centers on four functions, split by whether you work with a string or a file. Getting these straight removes almost all JSON confusion: the 's' suffix means 'string'.
- json.loads(s) — parse a JSON string into a Python object.
- json.dumps(obj) — serialize a Python object into a JSON string.
- json.load(file) — read and parse JSON from an open file.
- json.dump(obj, file) — write a Python object as JSON to an open file.
🔑Key Idea
Remember the 's': loads and dumps deal with strings, while load and dump deal with files. That single letter is the whole distinction.
3Parsing JSON Into Python
Parsing turns JSON text into Python objects you can navigate. JSON types map cleanly: objects become dictionaries, arrays become lists, strings and numbers stay as themselves, true/false become True/False, and null becomes None.
- raw = '{"users": [{"id": 1}, {"id": 2}], "active": true}'
- data = json.loads(raw)
- print(data['users'][0]['id']) # 1
- print(data['active']) # True (JSON true -> Python True)
Type Mapping
Understanding the type correspondence prevents surprises. JSON null becomes None, and JSON numbers become int or float depending on whether they have a decimal point.
JSON object -> Python dict
JSON array -> Python list
JSON true/false -> Python True/False
JSON null -> Python None4Creating JSON From Python
Serializing goes the other way, turning Python objects into JSON text. The indent argument produces human-readable, pretty-printed output, and sort_keys makes the result deterministic — useful for config files tracked in version control.
- record = {'name': 'Ava', 'roles': ['dev', 'lead'], 'active': True}
- compact = json.dumps(record) # single line
- pretty = json.dumps(record, indent=2, sort_keys=True)
- print(pretty)
💡Pro Tip
Pass ensure_ascii=False to dumps when your data contains non-English characters, so accented letters and emoji are written directly instead of as \u escape sequences.
5Reading and Writing JSON Files
For files on disk, use load and dump with an open file object. Combined with the with statement, this reads a config file or saves application state in just a couple of lines.
- with open('config.json', 'r', encoding='utf-8') as f:
- config = json.load(f) # file -> Python object
- config['version'] = 2
- with open('config.json', 'w', encoding='utf-8') as f:
- json.dump(config, f, indent=2) # Python object -> file
6Handling Non-Standard Types
JSON supports only a fixed set of types, so objects like datetime raise a TypeError when you try to serialize them. Supply a default function that tells dumps how to convert unsupported values into something JSON understands, such as an ISO-format string.
- from datetime import datetime
- def encode(obj):
- if isinstance(obj, datetime): return obj.isoformat()
- raise TypeError(f'Cannot serialize {type(obj)}')
- json.dumps({'now': datetime.now()}, default=encode)
Round-Tripping Custom Data
Because the default function only handles the write side, remember to convert values back when reading. For a datetime you would parse the ISO string with datetime.fromisoformat() after loading.
7Common Mistakes to Avoid
Most JSON errors come from mixing up the functions or forgetting JSON's rules.
- Confusing load with loads — load reads a file, loads reads a string.
- Forgetting that JSON keys are always strings, so integer keys become strings after a round trip.
- Trying to serialize sets, datetimes, or custom objects without a default function.
- Not handling json.JSONDecodeError when parsing untrusted or user-supplied text.
- Writing JSON without encoding='utf-8', which can corrupt non-ASCII characters.
- Assuming tuples survive — they are serialized as JSON arrays and come back as lists.
⚠️Watch Out
A round trip is not always lossless. Tuples become lists, integer dictionary keys become strings, and sets are not supported at all. Design your data with JSON's limited type set in mind.
8Handling Malformed JSON
Real-world JSON from APIs or user input is not always valid. Wrap parsing in a try/except that catches json.JSONDecodeError so a single bad response does not crash your program.
- try:
- data = json.loads(user_input)
- except json.JSONDecodeError as e:
- print(f'Invalid JSON: {e}')
- data = {}
9Key Takeaways
Working with JSON in Python comes down to a compact toolkit.
- The built-in json module needs no installation.
- loads/dumps handle strings; load/dump handle files.
- JSON objects become dicts and arrays become lists.
- Use indent for readability and a default function for custom types.
- Catch json.JSONDecodeError to handle malformed input safely.
10Frequently Asked Questions
Q: What is the difference between json.load and json.loads? A: json.loads parses a JSON string, while json.load reads and parses JSON from an open file object. The 's' stands for string. The same pattern applies to dumps (to a string) and dump (to a file).
Q: How do I pretty-print JSON in Python? A: Pass the indent argument to dumps or dump, for example json.dumps(data, indent=2). This adds line breaks and indentation for readability. Add sort_keys=True to order the keys consistently.
Q: Why can't I serialize a datetime to JSON? A: JSON only supports strings, numbers, booleans, null, arrays, and objects. A datetime is none of these, so it raises a TypeError. Supply a default function that converts it to a string, such as obj.isoformat().
Q: Do I need to install anything to use JSON in Python? A: No. The json module is part of the Python standard library, so you only need to import json. There is nothing to pip install for basic JSON reading and writing.
Related Reading
Get The Print Version
Download a PDF of this article for offline reading.
About the Publisher
SkillVeris Team
Engineering Team
Our engineering writers turn abstract code concepts into hands-on, project-driven learning experiences.
View all postsRelated Posts
Never miss an update
Get the latest tutorials and guides delivered to your inbox.
No spam. Unsubscribe anytime.