Skip to content

Instantly share code, notes, and snippets.

@PierceLBrooks
Created August 5, 2026 04:45
Show Gist options
  • Select an option

  • Save PierceLBrooks/50be15308f7ea0f507ada07aaa74669f to your computer and use it in GitHub Desktop.

Select an option

Save PierceLBrooks/50be15308f7ea0f507ada07aaa74669f to your computer and use it in GitHub Desktop.
jsondiff.py
# 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