The JSON Comparison package
This package is designed to compare two objects with a JSON-like structure and data types.
Install
pip install -U pip jsoncomparison
Usage
First you need to define two variables: expected & actual.
Think of them as the same variables that you use in tests.
Expected - the original data object that you want to see. Actual - the given data object.
Then we will transfer these objects to check and identify the difference between them:
from jsoncomparison import Compare, NO_DIFF
expected = {
"project": {
"name": "jsoncomparison",
"version": "0.1",
"license": "MIT",
"language": {
"name": "python",
"versions": [
3.5,
3.6
]
}
},
"os": "linux"
}
actual = {
"project": {
"name": "jsoncomparison",
"version": 0.1,
"license": "Apache 2.0",
"language": {
"name": "python",
"versions": [
3.6
]
}
}
}
diff = Compare().check(expected, actual)
assert diff != NO_DIFF
The check method returns a dictionary of differences between expected and actual objects:
{
"project": {
"version": {
"_message": "Types not equal. Expected: <str>, received: <float>",
"_expected": "str",
"_received": "float"
},
"license": {
"_message": "Values not equal. Expected: <MIT>, received: <Apache 2.0>",
"_expected": "MIT",
"_received": "Apache 2.0"
},
"language": {
"versions": {
"_length": {
"_message": "Lengths not equal. Expected <2>, received: <1>",
"_expected": 2,
"_received": 1
},
"_content": {
"0": {
"_message": "Value not found. Expected <3.5>",
"_expected": 3.5,
"_received": null
}
}
}
}
},
"os": {
"_message": "Key does not exists. Expected: <os>",
"_expected": "os",
"_received": null
}
}
Configuration
The default configuration can be overridden by passing the config dictionary to the Compare class constructor:
from jsoncomparison import Compare
config = {
"output": {
"console": False,
"file": {
"allow_nan": True,
"ensure_ascii": True,
"indent": 4,
"name": None,
"skipkeys": True,
},
},
"types": {
"float": {
"allow_round": 2,
},
"list": {
"check_length": True,
}
}
}
cmp = Compare(config)
Output
By default, the configuration does not allow printing the comparison result to the console, but at the same time writes the results to a file.
These settings can be changed in your class config:
config = {
"output": {
"console": True,
"file": {}
}
}
Ignore rules
What if you do not want to compare some values and keys of objects from your JSON?
In this case, you can define exception rules and pass them to the class constructor.
Let's go back to the example above:
from jsoncomparison import Compare, NO_DIFF
expected = {
# ...
}
actual = {
# ...
}
rules = {
"project": {
"version": "*",
"license": "*",
"language": {
"versions": {
"_values": [
3.5
]
}
}
},
"os": "*",
}
diff = Compare(rules=rules).check(expected, actual)
assert diff == NO_DIFF
Now that we have added exceptions to the missing values, the comparison test has been successfully passed!
Links
You can see a more complex comparison example that I used to test the correct operation of an application: link.
Metadata
Release files for jsoncomparison 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| jsoncomparison-1.1.0.tar.gz | 6.9 kB | Without provenance | Details for jsoncomparison-1.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| jsoncomparison-1.1.0-py3-none-any.whl | Python 3 | none | any | Details for jsoncomparison-1.1.0-py3-none-any.whl |
Total release size: 13.7 kB
Release files / jsoncomparison-1.1.0.tar.gz
| Download URL | jsoncomparison-1.1.0.tar.gz |
|---|---|
| Size | 6.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a0ac98848469a9683de68b1ac921a3dc93763c2a1dcdb7ad7ec3a541c2941781
|
|
BLAKE2b-256 checksum How to use checksums |
eb3964adc3dabf4905c081c1127f94efbe6ff6f227fe095aec36751131043244
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.1.6 CPython/3.8.9 Darwin/19.6.0
|
Release files / jsoncomparison-1.1.0-py3-none-any.whl
| Download URL | jsoncomparison-1.1.0-py3-none-any.whl |
|---|---|
| Size | 6.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1d7aa8bc91d95a3e7c68834ff10e7c454c5cf3be225ce4dbd8c60c09a1051ed1
|
|
BLAKE2b-256 checksum How to use checksums |
a1c636248771309b24da17ec0a5599cf1f92ddfef98563564f569fdf85eab4b6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.1.6 CPython/3.8.9 Darwin/19.6.0
|
Security for jsoncomparison 1.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.