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