# -*- coding: utf-8 -*- import json import os class CompareData: def read_json_from_file(self,fileDir): ''' 讀取.json文件內的json數據 入參:fileDir為文件的絕對路徑 返回:.json文件里的json數據 ''' # print("當前路徑 -> %s" %os.getcwd()) with open(fileDir) as json_file: json_data = json.load(json_file) return json_data def compare_json_value(self,data,dataOld,*ignore): # 統計丟失的數據 self.lostData = [] # 統計列表多出的數據個數 self.surplusData = [] # 統計不同的數據(不包括丟失的數據) self.differentData = [] self.compare_dic_value(data, dataOld, None, *ignore) result = {"lostData":self.lostData,"surplusData":self.surplusData,"differentData":self.differentData} return result def compare_dic_value(self,data,dataOld,dicLevel,*ignore): for item in dataOld: if dicLevel == None: preDicLevel = item else: preDicLevel = dicLevel + "." + item # print ("當前層級:" + preDicLevel) if preDicLevel not in ignore: newValue = data.get(item, "getItemErrorCK") if newValue == "getItemErrorCK": lost_data = {"dicLevel":preDicLevel,"dataOld":dataOld[item]} self.lostData.append(lost_data) print('*WARN*' + ' 丟失數據: ' + str(preDicLevel) + "--老接口數據為" + str(dataOld[item])) else: if isinstance(dataOld[item], list): # assert len(dataOld[item]) == len(data[item]) print("是個list") self.compare_list_value(data[item], dataOld[item], preDicLevel, *ignore) elif isinstance(dataOld[item], dict): print("是個dic") self.compare_dic_value(data[item], dataOld[item], preDicLevel, *ignore) else: self.compare_basic_value(data[item], dataOld[item], preDicLevel) def compare_list_value(self,data,dataOld,dicLevel,*ignore): #新數據比老數據中列表多出的數據 if len(data) > len(dataOld): for i in range(len(dataOld), len(data)): preDicLevel = dicLevel + "." + str(i) if preDicLevel not in ignore: surplus_data = {"dicLevel":preDicLevel,"dataError":data[i]} self.surplusData.append(surplus_data) print('*WARN*' + ' 列表多出數據: ' + str(preDicLevel)) for i in range(len(dataOld)): preDicLevel = dicLevel + "." + str(i) # print ("當前層級:" + preDicLevel) if i + 1 <= len(data): if preDicLevel not in ignore: if isinstance(dataOld[i], list): assert len(dataOld[i]) == len(data[i]) self.compare_list_value(data[i], dataOld[i], preDicLevel, *ignore) elif isinstance(dataOld[i], dict): self.compare_dic_value(data[i], dataOld[i], preDicLevel, *ignore) else: self.compare_basic_value(data[i], dataOld[i], preDicLevel) else: #新數據比老數據中列表丟失的數據 lost_data = {"dicLevel":preDicLevel,"dataOld":dataOld[i]} self.lostData.append(lost_data) def compare_basic_value(self,data,dataOld,dicLevel): if data != dataOld: print('*WARN*' + ' 數據不一致: ' + str(dicLevel) + "--老接口數據為" + str( dataOld) + "--新接口數據為" + str(data)) dif_data = {"dicLevel":dicLevel,"dataError":data,"dataOld":dataOld} self.differentData.append(dif_data) def compare_json_key(self,data,dataOld,*ignore): # 統計丟失的數據 self.lostData = [] # 統計列表多出的數據個數 self.surplusData = [] # 統計不同的數據(不包括丟失的數據) self.differentData = [] self.compare_dic_key(data, dataOld, None, *ignore) result = {"lostData":self.lostData,"surplusData":self.surplusData,"differentData":self.differentData} return result def compare_dic_key(self,data,dataOld,dicLevel,*ignore): for item in dataOld: if dicLevel == None: preDicLevel = item else: preDicLevel = dicLevel + "." + item # print ("當前層級:" + preDicLevel) if preDicLevel not in ignore: newValue = data.get(item, "getItemErrorCK") if newValue == "getItemErrorCK": lost_data = {"dicLevel":preDicLevel,"dataOld":dataOld[item]} self.lostData.append(lost_data) print('*WARN*' + ' 丟失數據: ' + str(preDicLevel) + "--老接口數據為" + str(dataOld[item])) else: if isinstance(dataOld[item], list): # assert len(dataOld[item]) == len(data[item]) print("是個list") self.compare_list_key(data[item], dataOld[item], preDicLevel, *ignore) elif isinstance(dataOld[item], dict): print("是個dic") self.compare_dic_key(data[item], dataOld[item], preDicLevel, *ignore) def compare_list_key(self,data,dataOld,dicLevel,*ignore): #新數據比老數據中列表多出的數據 if len(data) > len(dataOld): for i in range(len(dataOld), len(data)): preDicLevel = dicLevel + "." + str(i) if preDicLevel not in ignore: surplus_data = {"dicLevel":preDicLevel,"dataError":data[i]} self.surplusData.append(surplus_data) print('*WARN*' + ' 列表多出數據: ' + str(preDicLevel)) for i in range(len(dataOld)): preDicLevel = dicLevel + "." + str(i) # print ("當前層級:" + preDicLevel) if i + 1 <= len(data): if preDicLevel not in ignore: if isinstance(dataOld[i], list): assert len(dataOld[i]) == len(data[i]) self.compare_list_key(data[i], dataOld[i], preDicLevel, *ignore) elif isinstance(dataOld[i], dict): self.compare_dic_key(data[i], dataOld[i], preDicLevel, *ignore) else: #新數據比老數據中列表丟失的數據 lost_data = {"dicLevel":preDicLevel,"dataOld":dataOld[i]} self.lostData.append(lost_data)