Skip to content

Instantly share code, notes, and snippets.

@kgorman
Forked from magnetikonline/README.md
Created January 24, 2023 21:06
Show Gist options
  • Save kgorman/094473c23e5ebd58f4ca4c48a38518a2 to your computer and use it in GitHub Desktop.
Save kgorman/094473c23e5ebd58f4ca4c48a38518a2 to your computer and use it in GitHub Desktop.
Python - comparing JSON data structures.

Python - comparing JSON data structures

A function compare_json_data(source_data_a,source_data_b), accepting structures populated with data loaded from json.load() and comparing for equality.

Example

$ ./compare.py 
Compare JSON result is: True

JSON files a.json and b.json are loaded via load_json() function and structures passed into compare_json_data() for comparison.

{
"apple": "value",
"orange": 12,
"banana": [1,2,3,"One","Two","Three","Fourth"],
"grape": false,
"strawberry": null,
"carrot": [
{
"fourth": "value-two",
"first": {
"apple": "value1",
"orange": "value2"
},
"second": "value",
"third": "another"
},
{},
["One","Two","Three"]
],
"pear": {
"first": "value",
"second": "another",
"third": [1,2,3,"One","Two","Three"],
"fourth": [
{
"first": "value",
"second": "another"
},
{}
]
}
}
{
"apple": "value",
"orange": 12,
"banana": [1,2,3,"One","Two","Three","Fourth"],
"pear": {
"first": "value",
"second": "another",
"third": [1,2,3,"One","Two","Three"],
"fourth": [
{
"second": "another",
"first": "value"
},
{}
]
},
"grape": false,
"strawberry": null,
"carrot": [
{
"second": "value",
"third": "another",
"fourth": "value-two",
"first": {
"apple": "value1",
"orange": "value2"
}
},
{},
["One","Two","Three"]
]
}
#!/usr/bin/env python3
import json
def load_json(file_path):
# open JSON file and parse contents
fh = open(file_path, "r")
data = json.load(fh)
fh.close()
return data
def compare_json_data(source_data_a, source_data_b):
def compare(data_a, data_b):
# type: list
if type(data_a) is list:
# is [data_b] a list and of same length as [data_a]?
if (type(data_b) is not list) or (len(data_a) != len(data_b)):
return False
# iterate over list items
for list_index, list_item in enumerate(data_a):
# compare [data_a] list item against [data_b] at index
if not compare(list_item, data_b[list_index]):
return False
# list identical
return True
# type: dictionary
if type(data_a) is dict:
# is [data_b] a dictionary?
if type(data_b) is not dict:
return False
# iterate over dictionary keys
for dict_key, dict_value in data_a.items():
# key exists in [data_b] dictionary, and same value?
if (dict_key not in data_b) or (
not compare(dict_value, data_b[dict_key])
):
return False
# dictionary identical
return True
# simple value - compare both value and type for equality
return (data_a == data_b) and (type(data_a) is type(data_b))
# compare a to b, then b to a
return compare(source_data_a, source_data_b) and compare(
source_data_b, source_data_a
)
def main():
# import testing JSON files to Python structures
a_json = load_json("a.json")
b_json = load_json("b.json")
# compare first struct against second
print(f"Compare JSON result is: {compare_json_data(a_json, b_json)}")
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment