A deterministic JSON payload mapper that transforms source data into target structures using dotted paths, indices and wildcards.
Project description
✨ jsonshift
A lightweight Python package to convert one JSON payload into another using a declarative mapping spec defined in JSON.
Designed for deterministic system integrations, data pipelines, and API adapters.
⚙️ Engine rules
-
If the source path does not exist → raises
MappingMissingError(unlessoptional: trueis set) -
If the source value is
null/None→ the destination receivesNone(defaults do NOT overrideNone) -
defaultsonly fill values when the destination field is absent (never overwrite existing values orNone) -
Supports:
- dotted paths
- indexed paths (
[0]) - wildcard paths (
[*]) - automatic list creation
- infinite nesting depth
-
Supports optional mappings using
optional: true -
Supports dynamic defaults:
{ "$now": "date" }{ "$now": "datetime" }{ "$now": "time" }
🧩 Installation
pip install jsonshift
# or for development:
pip install -e .[dev]
🚀 Complex example (Python)
from jsonshift import Mapper
payload = {
"customer_name": "John Doe",
"cpf": "12345678901",
"email": "john@doe.com",
"amount": 1500.0,
"installments": 6,
"products": [
{"id": "P-001", "name": "Notebook", "price": 4500.0},
{"id": "P-002", "name": "Mouse", "price": 250.0}
]
}
spec = {
"map": {
"customer.name": "customer_name",
"customer.cpf": "cpf",
"customer.email": {
"path": "email",
"optional": True
},
"contract.amount": "amount",
"contract.installments": "installments",
"contract.products[*].code": "products[*].id",
"contract.products[*].title": "products[*].name",
"contract.products[*].price": "products[*].price",
"contract.main_product[0].code": "products[0].id",
"contract.main_product[0].title": "products[0].name"
},
"defaults": {
"contract.type": "CCB",
"contract.origin": "ORQ",
"contract.created_date": {"$now": "date"},
"contract.created_at": {"$now": "datetime"},
"contract.created_time": {"$now": "time"},
"contract.products[*].currency": "BRL"
}
}
out = Mapper().transform(spec, payload)
print(out)
Output (example):
{
"customer": {
"name": "John Doe",
"cpf": "12345678901",
"email": "john@doe.com"
},
"contract": {
"amount": 1500.0,
"installments": 6,
"type": "CCB",
"origin": "ORQ",
"created_date": "2025-01-08",
"created_at": "2025-01-08T12:00:00",
"created_time": "12:00:00",
"products": [
{
"code": "P-001",
"title": "Notebook",
"price": 4500.0,
"currency": "BRL"
},
{
"code": "P-002",
"title": "Mouse",
"price": 250.0,
"currency": "BRL"
}
],
"main_product": [
{
"code": "P-001",
"title": "Notebook"
}
]
}
}
🖥️ Command-line interface (CLI)
Using the same example from examples/:
jsonshift --spec examples/spec.json --input examples/payload.json
Or via stdin:
cat examples/payload.json | jsonshift --spec examples/spec.json
The output structure is identical to the Python example above.
🧪 Testing
pytest -v
📄 License
MIT © 2025 Pedro Marques
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jsonshift-1.1.0.tar.gz.
File metadata
- Download URL: jsonshift-1.1.0.tar.gz
- Upload date:
- Size: 6.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
06cfe0a96d4b6a9c6e86bcf52dbf2e4cfdde01d63c604cc592a4d39de4afacba
|
|
| MD5 |
66bf0f4279314faa0a7ed8ee84363a37
|
|
| BLAKE2b-256 |
f919936c68fee361149c839139fbc8271bd387206d501c087ffe10dcbae34f44
|
File details
Details for the file jsonshift-1.1.0-py3-none-any.whl.
File metadata
- Download URL: jsonshift-1.1.0-py3-none-any.whl
- Upload date:
- Size: 6.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7ea0e9da7b18cbd9068781b8c6f686fd16cff62ee89d07d8cbc988891ed9c56a
|
|
| MD5 |
090c5b2c43daa6cd76d6fc8c4b391512
|
|
| BLAKE2b-256 |
64c16b78be0c24f2f2d6cce0e7286a6632f78a135ad2f7eaff6f88aa0fa5c25d
|