# ============LICENSE_END=================================================
#
-# Deep compare of two json obects
-# If a parameter value in the target json is set to '????' then the result json value is not checked for that parameter
-# Any included json array will be sorted before comparison
+# This script compare two jsons for eqaulity, taken into account that the parameter values
+# marked with '????' are not checked (only the parameter name need to exist)
+# Example of target json with '????'
+# [
+# {
+# "callbackUrl": "????",
+# "keepAliveIntervalSeconds": "????",
+# "serviceName": "serv2",
+# "timeSinceLastActivitySeconds": "????"
+# },
+# {
+# "callbackUrl": "????",
+# "keepAliveIntervalSeconds": "????",
+# "serviceName": "serv1",
+# "timeSinceLastActivitySeconds": "????"
+# }
+#]
-import sys
+
+import os
import json
+import sys
-def compare_json(jsonTarget,jsonResult):
-
-
- if isinstance(jsonTarget, dict):
- if (len(jsonTarget) != len(jsonResult)):
- return 1
- for key in jsonTarget.keys():
- if (jsonResult.get(key) is None):
- return 1
- res=compare_json(jsonTarget.get(key), jsonResult.get(key))
- if (res != 0):
- return 1
- elif isinstance(jsonTarget, list):
- if (len(jsonTarget) != len(jsonResult)):
- return 1
- jsonTarget.sort()
- jsonResult.sort()
- for i in range(len(jsonTarget)):
- res=compare_json(jsonTarget[i], jsonResult[i])
- if (res != 0):
- return 1
- else:
- if (jsonTarget != "????") and (jsonTarget != jsonResult):
- return 1
- return 0
+# # Helper function to compare two json list.
+# # Returns true for equal, false for not equal
+def compare_json_list(list1, list2):
+ if (list1.__len__() != list2.__len__()):
+ return False
+ for l in list1:
+ found = False
+ for m in list2:
+ res = compare_json(l, m)
+ if (res):
+ found = True
+ break
-try:
- jsonTarget = json.loads(sys.argv[1])
- jsonResult = json.loads(sys.argv[2])
+ if (not found):
+ return False
+
+ return True
+
+# Deep compare of two json obects
+# If a parameter value in the target json is set to '????' then the result json value is not checked for the that parameter
+# Return true for equal json, false for not equal json
+def compare_json(obj1, obj2):
+ if isinstance(obj1, list):
+ if (not isinstance(obj2, list)):
+ return False
+ return compare_json_list(obj1, obj2)
+ elif (isinstance(obj1, dict)):
+ if (not isinstance(obj2, dict)):
+ return False
+ exp = set(obj2.keys()) == set(obj1.keys())
+ if (not exp):
+ return False
+ for k in obj1.keys():
+ val1 = obj1.get(k)
+ val2 = obj2.get(k)
+ if isinstance(val1, list):
+ if (not compare_json_list(val1, val2)):
+ return False
+ elif isinstance(val1, dict):
+ if (not compare_json(val1, val2)):
+ return False
+ else:
+ #Do not check parameter values marked with '????'
+ if ((val1 != "????") and (val2 != val1)) and ((val2 != "????") and (val2 != val1)):
+ return False
+ else:
+ return obj1 == obj2
- print(compare_json(jsonTarget,jsonResult))
+ return True
-except Exception as e:
- print (1)
-sys.exit()
+# Compare two json object. Returns true if equal, false if not equal
+# This function is intended to be used from other python scipts using json object (instead of files)
+def compare(target, result):
+ try:
+ res1=compare_json(target, result)
+ res2=compare_json(target, result)
+ if (res1 and res2):
+ return True
+ else:
+ return False
+ except Exception:
+ return False
+if __name__ == '__main__':
+ try:
+ #Read the input file and compare the two json (target->result)
+ jsonTarget = json.loads(sys.argv[1])
+ jsonResult = json.loads(sys.argv[2])
+ res1=compare_json(jsonTarget, jsonResult)
+ #Read the json again (in case the previous calls has re-arranged the jsons)
+ jsonTarget = json.loads(sys.argv[1])
+ jsonResult = json.loads(sys.argv[2])
+ #Compare the opposite order (result->target) to catch special duplicate json key cases
+ res2=compare_json(jsonResult, jsonTarget)
+ if (res1 and res2):
+ print (0)
+ else:
+ print (1)
+ except Exception:
+ print (1)
+ sys.exit()
\ No newline at end of file