# ============LICENSE_END=================================================
#
+# 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 os
import json
import sys
-# 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
-# Any included json array will be sorted before comparison
-# An optional array key can be given to sort array of objects containing that key
+# # 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
-def comparejson(jsonTarget,jsonResult,arrayKey):
+ for l in list1:
+ found = False
+ for m in list2:
+ res = compare_json_obj(l, m)
+ if (res):
+ found = True
+ break
- if isinstance(jsonTarget, dict):
- if (len(jsonTarget) != len(jsonResult)):
- return 1
- for key in jsonTarget.keys():
- if (jsonResult.get(key) is None):
- return 1
- if (comparejson(jsonTarget.get(key), jsonResult.get(key), arrayKey) != 0):
- return 1
- elif isinstance(jsonTarget, list):
- if (len(jsonTarget) != len(jsonResult)):
- return 1
- if (arrayKey is None):
- jsonTarget.sort()
- jsonResult.sort()
- else:
- jsonTarget.sort(key=lambda k: k[arrayKey])
- jsonResult.sort(key=lambda k: k[arrayKey])
+ if (not found):
+ return False
- for i in range(len(jsonTarget)):
- if (comparejson(jsonTarget[i], jsonResult[i], arrayKey) != 0):
- return 1
+ 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_obj(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_obj(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:
- if (jsonTarget != "????") and (jsonTarget != jsonResult):
- return 1
- return 0
+ return obj1 == obj2
+
+ return True
+
try:
+ #Read the input file and compare the two json (target->result)
jsonTarget = json.loads(sys.argv[1])
jsonResult = json.loads(sys.argv[2])
- arrayKey = None
- if (len(sys.argv) > 3):
- arrayKey = sys.argv[3]
- print(comparejson(jsonTarget,jsonResult,arrayKey))
+ res1=compare_json_obj(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_obj(jsonResult, jsonTarget)
+
+ if (res1 and res2):
+ print (0)
+ else:
+ print (1)
except Exception as e:
print (1)