# -*- 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)