Skip to main content

The JSON Comparison package

Build Status License: MIT

This package is designed to compare two objects with a JSON-like structure and data types.

Installation

pip install jsoncomparison

Usage

First you need to define two variables: expected & actual. Think of them as the same variables that you use in unittests.

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


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 != {}

The check method returns a dictionary of differences between expected and actual objects, and report about it.

Diff output:

{
    "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
    }
}

To check if the objects are the same, just call:

diff = Compare().check(expected, actual)
self.assertEqual(diff, {})

Configuration

You can define your configuration file and transfer it to Compare class constructor. But first make sure that the structure of your configuration file is similar to this.

Example:

import json
from jsoncomparison import Compare


with open('config', 'r') as fp:
    config = json.load(fp)

cmp = Compare(config)

Output

By default, the configuration file 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 configuration file:

{    
    "output": {
        "console": true,
        "file": {
            "name": "my-output-file.json",
            "indent": 4
        }
    }
}

Ignore rules

What if you do not want to compare some values and keys of objects from your JSON's? 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


expected = {
    # ...
}

actual = {
    # ...
}

rules = {
    'project': {
        'version': '*',
        'license': '*',
        'language': {
            'versions': {
                '_values': [
                    3.5
                ]
            }
        }
    },
    'os': '*',
}

diff = Compare(rules=rules).check(expected, actual)
assert 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 0.1.1

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 0.1.1
File Size Uploaded
jsoncomparison-0.1.1.tar.gz 6.2 kB Details

Built distribution (wheel)

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

Total release size: 15.2 kB

Release files / jsoncomparison-0.1.1.tar.gz

Download URL jsoncomparison-0.1.1.tar.gz
Size 6.2 kB
Tags Source
SHA-256 checksum
How to use checksums
15c1c8ab69a940a0722bf663e8596dbe52859f9b8ee905930d18020d481531a9
BLAKE2b-256 checksum
How to use checksums
db31542344870d8a49d164fab072618bfb6975f55ab882afe9fb8ddd8979981f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.12.1 pkginfo/1.4.2 requests/2.19.1 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.6.6

Release files / jsoncomparison-0.1.1-py3-none-any.whl

Download URL jsoncomparison-0.1.1-py3-none-any.whl
Size 9.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8c8abbdf0d8cbc4c9ff0864c7975b9cf3d5eb06c650c68109a1ac08ca4443484
BLAKE2b-256 checksum
How to use checksums
6a2c0e131d06bcafc8e39fa308a1f4522b523ab14ca5fdca399597378c6fa21c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.12.1 pkginfo/1.4.2 requests/2.19.1 setuptools/40.4.3 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.6.6

Release history Release notifications | RSS feed

1.1.0

2 release files

1.0.1

1 release file

1.0.0

1 release file

This release

0.1.1 This release

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