Created
August 5, 2026 04:45
-
-
Save PierceLBrooks/50be15308f7ea0f507ada07aaa74669f to your computer and use it in GitHub Desktop.
jsondiff.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # Author: Pierce Brooks | |
| import os | |
| import sys | |
| import json | |
| import logging | |
| import traceback | |
| def visit(tier, parents, left, right): | |
| if (sys.flags.debug): | |
| print(str(parents)+" @ "+str(tier)) | |
| result = True | |
| diffs = [] | |
| if not (str(type(left)) == str(type(right))): | |
| result = False | |
| diffs.append(parents+[left]) | |
| return tuple([result, diffs]) | |
| if (("dict" in str(type(left))) or ("list" in str(type(left))) or ("str" in str(type(left)))): | |
| length = len(left) | |
| if not (length == len(right)): | |
| result = False | |
| length = min(length, len(right)) | |
| if ("dict" in str(type(left))): | |
| if (sys.flags.debug): | |
| print("dict") | |
| keys = list(left.keys()) | |
| for key in keys: | |
| if (sys.flags.debug): | |
| print(str(parents+[key])+" @ "+str(tier)) | |
| if not (key in right): | |
| result = False | |
| diffs.append(parents+[key]) | |
| continue | |
| status, results = visit(tier+1, parents+[key], left[key], right[key]) | |
| if not (status): | |
| result = False | |
| for i in range(len(results)): | |
| diffs.append(results[i]) | |
| else: | |
| if ("list" in str(type(left))): | |
| if (sys.flags.debug): | |
| print("list") | |
| for i in range(length): | |
| if (sys.flags.debug): | |
| print(str(parents+[i])+" @ "+str(tier)) | |
| status, results = visit(tier+1, parents+[i], left[i], right[i]) | |
| if not (status): | |
| result = False | |
| diffs.append(parents+[i]) | |
| for j in range(len(results)): | |
| diffs.append(results[j]) | |
| else: | |
| if (sys.flags.debug): | |
| print("str") | |
| if ((result) and not (left == right)): | |
| result = False | |
| diffs.append(parents+[left]) | |
| return tuple([result, diffs]) | |
| if (left is None): | |
| return tuple([result, diffs]) | |
| if not (left == right): | |
| result = False | |
| diffs.append(parents+[left]) | |
| return tuple([result, diffs]) | |
| def load(target): | |
| descriptor = open(target, "r") | |
| content = descriptor.read() | |
| descriptor.close() | |
| data = json.loads(content) | |
| return data | |
| if (len(sys.argv) < 3): | |
| sys.exit() | |
| left = sys.argv[1] | |
| right = sys.argv[2] | |
| if not ((os.path.exists(left)) and (os.path.exists(right))): | |
| sys.exit() | |
| try: | |
| left = load(left) | |
| right = load(right) | |
| result, diffs = visit(0, [None], left, right) | |
| if not (result): | |
| for diff in diffs: | |
| print(json.dumps(diff[1:])) | |
| except: | |
| if (sys.flags.debug): | |
| logging.error(traceback.format_exc()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment