Skip to content

Instantly share code, notes, and snippets.

@saswata-dutta
Forked from magnetikonline/README.md
Created March 18, 2019 14:45
Show Gist options
  • Save saswata-dutta/632887f8919e65fd22da5b9d7d9313ac to your computer and use it in GitHub Desktop.
Save saswata-dutta/632887f8919e65fd22da5b9d7d9313ac 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

$ python 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 python
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) != 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) != 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('Compare JSON result is: {0}'.format(
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