Skip to content

Easily compare JSON-files of any size, using keys and multi-keys or ignore fields as you want.

License

Notifications You must be signed in to change notification settings

a-a-novikov/json-compare

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

json-compare

Json-compare is a simple package that allows you to easily and fastly compare two .json files. Support key and multi-key comparison. You can also ignore certain fields' values or perform comparison insensitive to data types.

made-with-python

Installation

pip install json-files-compare

Usage

Compare files just as they are:

from json_compare import JSONComparator

comparator = JSONComparator(
    left_file_path="expected.json",
    right_file_path="actual.json",
)

# compare "actual.json" from the perspective of "expected.json"'s structure
comparator.compare_with_right()  # / compare_with_left() / full_compare()

# save diff logs to ".comparison_logs" folder
comparator.save_diff_logs(path="comparison_logs")

# or print them into stdout
diffs = comparator.diff_log.log
print("\n".join(diffs))

# or print only summary. Here's an example:
print(comparator.diff_log.get_summary())

# OUTPUT example:
# ---------------------
# TOTAL: 4 differences
# -missing_obj_property: 3
# -unequal_value: 4

Set key property to perform more accurate comparisons of objects in arrays:

# expected.json: {"cats": [{"id": 4, "name": "Nyan"}, {"id": 2, "name": "Marx"}, {"id": 8, "name": "Flake"}]}
# actual.json: {"cats": [{"id": 2, "name": "Marx"}, {"id": 4, "name": "Naan"}]}

comparator = JSONComparator(
    left_file_path="expected.json",
    right_file_path="actual.json",
    key="DATA//cats//<array>//id",  # <----- just pass a "path" to needed property with following keywords: 
)                                            # DATA - points to the root of file 
                                             # <array> - indicates array with key property's object

In this case, saved diff log would look like that:

actual.json//cats//<array>
lack of items in array: expected 3 items, got only 2
actual.json//cats//<array>//[0]//name
unequal values: expected "Nyan", got "Naan" instead
actual.json//cats//<array>//[2]
missing array item: expected <object> with "id"=8

You can go further and add non-important fields to ignore parameter:

# expected.json: [{"id": 4, "name": "Nyan", "age": 2}, {"id": 2, "name": "Marx", "age": 7}, {"id": 8, "name": "Flake", "age": 4}]
# actual.json: [{"id": 2, "name": "Marx", "age": 7}, {"id": 4, "name": "Naan", "age": "two"}, {"id": 9, "name": "Lol", "age": 1}]

comparator = JSONComparator(
    left_file_path="expected.json",
    right_file_path="actual.json",
    key="DATA//<array>//id",
    ignore="DATA//<array>//age"  # <-------
)  

And here the result:

actual.json//<array>//[0]//name
unequal values: expected "Nyan", got "Naan" instead
actual.json//<array>//[2]
missing array item: expected <object> with "id"=8

If you want to compare ignoring type-differences between similar values like "1.4" vs 1.4 or "[\"New Age №1\"]" vs ["New Age №1"] - just add ignore_types=True param to JSONComparator:

comparator = JSONComparator(
    left_file_path="expected.json",
    right_file_path="actual.json",
    key="DATA//<array>//id",
    ignore_types=True,  # <-------
)  

About

Easily compare JSON-files of any size, using keys and multi-keys or ignore fields as you want.

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Languages