Diff JSON and JSON-like structures in Python
Project description
jsondiff
Diff JSON and JSON-like structures in Python.
Installation
pip install jsondiff
Quickstart
>>> import jsondiff as jd
>>> from jsondiff import diff
>>> diff({'a': 1, 'b': 2}, {'b': 3, 'c': 4})
{'c': 4, 'b': 3, delete: ['a']}
>>> diff(['a', 'b', 'c'], ['a', 'b', 'c', 'd'])
{insert: [(3, 'd')]}
>>> diff(['a', 'b', 'c'], ['a', 'c'])
{delete: [1]}
# Typical diff looks like what you'd expect...
>>> diff({'a': [0, {'b': 4}, 1]}, {'a': [0, {'b': 5}, 1]})
{'a': {1: {'b': 5}}}
# ...but similarity is taken into account
>>> diff({'a': [0, {'b': 4}, 1]}, {'a': [0, {'c': 5}, 1]})
{'a': {insert: [(1, {'c': 5})], delete: [1]}}
# Support for various diff syntaxes
>>> diff({'a': 1, 'b': 2}, {'b': 3, 'c': 4}, syntax='explicit')
{insert: {'c': 4}, update: {'b': 3}, delete: ['a']}
>>> diff({'a': 1, 'b': 2}, {'b': 3, 'c': 4}, syntax='symmetric')
{insert: {'c': 4}, 'b': [2, 3], delete: {'a': 1}}
>>> diff({'list': [1, 2, 3], "poplist": [1, 2, 3]}, {'list': [1, 3]}, syntax="rightonly")
{"list": [1, 3], delete: ["poplist"]}
# Special handling of sets
>>> diff({'a', 'b', 'c'}, {'a', 'c', 'd'})
{discard: set(['b']), add: set(['d'])}
# Load and dump JSON
>>> print diff('["a", "b", "c"]', '["a", "c", "d"]', load=True, dump=True)
{"$delete": [1], "$insert": [[2, "d"]]}
# NOTE: Default keys in the result are objects, not strings!
>>> d = diff({'a': 1, 'delete': 2}, {'b': 3, 'delete': 4})
>>> d
{'delete': 4, 'b': 3, delete: ['a']}
>>> d[jd.delete]
['a']
>>> d['delete']
4
# Alternatively, you can use marshal=True to get back strings with a leading $
>>> diff({'a': 1, 'delete': 2}, {'b': 3, 'delete': 4}, marshal=True)
{'delete': 4, 'b': 3, '$delete': ['a']}
Command Line Client
Usage:
jdiff [-h] [-p] [-s {compact,symmetric,explicit}] [-i INDENT] [-f {json,yaml}] first second
positional arguments:
first
second
optional arguments:
-h, --help show this help message and exit
-p, --patch
-s {compact,symmetric,explicit}, --syntax {compact,symmetric,explicit}
Diff syntax controls how differences are rendered (default: compact)
-i INDENT, --indent INDENT
Number of spaces to indent. None is compact, no indentation. (default: None)
-f {json,yaml}, --format {json,yaml}
Specify file format for input and dump (default: json)
Examples:
$ jdiff a.json b.json -i 2
$ jdiff a.json b.json -i 2 -s symmetric
$ jdiff a.yaml b.yaml -f yaml -s symmetric
Development
Install development dependencies and test locally with
pip install -r requirements-dev.txt
# ... do your work ... add tests ...
pytest
Installing From Source
To install from source run
pip install .
This will install the library and cli for jsondiff
as well as its runtime
dependencies.
Testing before release
python -m build
twine check dist/*
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
jsondiff-2.1.2.tar.gz
(26.1 kB
view details)
Built Distribution
jsondiff-2.1.2-py3-none-any.whl
(13.2 kB
view details)
File details
Details for the file jsondiff-2.1.2.tar.gz
.
File metadata
- Download URL: jsondiff-2.1.2.tar.gz
- Upload date:
- Size: 26.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.12.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8a33728db8fdd118414e2c92778d64b77c90e09459b8dd601e56941edacb8542 |
|
MD5 | f24c08a06bcadec74c7c065e60761fa6 |
|
BLAKE2b-256 | f07fbdcfaa610565d05eb0adf28f497761f8d7f4f4089af5adafaf377ff0c45b |
File details
Details for the file jsondiff-2.1.2-py3-none-any.whl
.
File metadata
- Download URL: jsondiff-2.1.2-py3-none-any.whl
- Upload date:
- Size: 13.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.12.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9b00c9752b572474760e9767285567688c7d5aa8899423e5de7345825eda041a |
|
MD5 | 46ff54c48b82754e0fa2eb7b9cb887d2 |
|
BLAKE2b-256 | 38194f5acf46e577d8f34ef3c8e3e86af6ad71fa9bc29e8cd0db0e313c781f51 |