Skip to main content

The JSON Comparison package

Build Status codecov Python 3.6+ PyPI version License: MIT

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!

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)

Source distribution for jsoncomparison 1.1.0
File Size Uploaded
jsoncomparison-1.1.0.tar.gz 6.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for jsoncomparison 1.1.0
File Interpreter ABI Platform
jsoncomparison-1.1.0-py3-none-any.whl Python 3 none any Details

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

Release history Release notifications | RSS feed

This release

1.1.0 This release

2 release files

1.0.1

1 release file

1.0.0

1 release file

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page