DynamoDB JSON
dynamodb-json is a Python utility library designed to simplify the process of converting Python objects to and from the specific JSON format used by Amazon DynamoDB. It handles the marshalling and unmarshalling of various Python data types, including decimals and datetimes, into the DynamoDB-compatible JSON structure. The current version is 1.4.2 and it maintains an active release cadence, with recent updates focusing on compatibility and bug fixes.
Warnings
- breaking Older versions of dynamodb-json (pre-1.3) might have compatibility issues with Python 3.4+ due to changes in `.next()` iterator syntax. Specifically, version 1.2 addressed Python 3.4+ compatibility and version 1.3 addressed Python 3.5+ compatibility by changing `.next()` to `next()`.
- gotcha DynamoDB does not natively support floating-point numbers and expects numerical values to be represented as `Decimal` types to avoid precision issues. While `dynamodb-json` handles this conversion during marshalling/unmarshalling, users must ensure their Python applications use `Decimal` for numbers that might otherwise be floats.
- gotcha DynamoDB has specific data type representations (e.g., `{'S': 'string'}`, `{'N': '123'}`). Manually constructing or parsing DynamoDB JSON without `dynamodb-json` can lead to `ValidationException` errors if the format or types are incorrect.
Install
-
pip install dynamodb-json
Imports
- json_util
from dynamodb_json import json_util as json
Quickstart
import os
from datetime import datetime
from decimal import Decimal
from dynamodb_json import json_util as json
# Example Python object with various data types
python_object = {
"Id": 123,
"Name": "Example Item",
"IsActive": True,
"Price": Decimal('99.99'), # DynamoDB expects Decimal for numbers
"CreatedAt": datetime.now(),
"Tags": ["aws", "python", "json"],
"Details": {
"Key": "Value",
"Number": 456
}
}
# 1. Marshal Python object to DynamoDB JSON format
dynamodb_json_format = json.dumps(python_object)
print("DynamoDB JSON Format:")
print(dynamodb_json_format)
# Example DynamoDB JSON string (as if received from DynamoDB)
# Note: datetime objects are converted to ISO 8601 strings during dumps
# and then parsed back to datetime during loads if possible.
# Decimals are preserved.
db_json_string = '{"Id": {"N": "123"}, "Name": {"S": "Example Item"}, "IsActive": {"BOOL": true}, "Price": {"N": "99.99"}, "CreatedAt": {"S": "2026-04-10T18:54:00.000000"}, "Tags": {"L": [{"S": "aws"}, {"S": "python"}, {"S": "json"}]}, "Details": {"M": {"Key": {"S": "Value"}, "Number": {"N": "456"}}}}'
# 2. Unmarshal DynamoDB JSON format back to Python object
python_object_from_db = json.loads(db_json_string)
print("\nPython Object from DynamoDB JSON:")
print(python_object_from_db)
print(f"Type of Price: {type(python_object_from_db['Price'])}")
print(f"Type of CreatedAt: {type(python_object_from_db['CreatedAt'])}")