修复 部分 json 数据不能识别
修复 标签字段比对不完全
This commit is contained in:
@@ -86,8 +86,8 @@ def compare_results(pro_data, test_data, keys, fields_to_compare, exclude_fields
|
||||
value_pro = getattr(row_pro, column)
|
||||
value_test = getattr(row_test, column)
|
||||
|
||||
# 使用智能比较函数
|
||||
if not compare_values(value_pro, value_test):
|
||||
# 使用智能比较函数,传递字段名用于标签字段判断
|
||||
if not compare_values(value_pro, value_test, column):
|
||||
has_difference = True
|
||||
# 格式化显示值
|
||||
formatted_pro_value = format_json_for_display(value_pro)
|
||||
@@ -99,7 +99,8 @@ def compare_results(pro_data, test_data, keys, fields_to_compare, exclude_fields
|
||||
'pro_value': formatted_pro_value,
|
||||
'test_value': formatted_test_value,
|
||||
'is_json': is_json_field(value_pro) or is_json_field(value_test),
|
||||
'is_array': is_json_array_field(value_pro) or is_json_array_field(value_test)
|
||||
'is_array': is_json_array_field(value_pro) or is_json_array_field(value_test),
|
||||
'is_tag': is_tag_field(column, value_pro) or is_tag_field(column, value_test)
|
||||
})
|
||||
|
||||
# 统计字段差异次数
|
||||
@@ -307,9 +308,54 @@ def is_json_field(value):
|
||||
except (json.JSONDecodeError, TypeError):
|
||||
return False
|
||||
|
||||
def compare_values(value1, value2):
|
||||
"""智能比较两个值,支持JSON标准化和数组比较"""
|
||||
# 首先检查是否为数组类型
|
||||
def is_tag_field(field_name, value):
|
||||
"""判断是否为标签类字段(空格分隔的标签列表)
|
||||
|
||||
标签字段特征:
|
||||
1. 字段名包含 'tag' 关键字
|
||||
2. 值是字符串类型
|
||||
3. 包含空格分隔的多个元素
|
||||
"""
|
||||
if not isinstance(value, str):
|
||||
return False
|
||||
|
||||
# 检查字段名是否包含tag
|
||||
if field_name and 'tag' in field_name.lower():
|
||||
# 检查是否包含空格分隔的多个元素
|
||||
elements = value.strip().split()
|
||||
if len(elements) > 1:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def compare_tag_values(value1, value2):
|
||||
"""比较标签类字段的值(忽略顺序)
|
||||
|
||||
将空格分隔的标签字符串拆分成集合进行比较
|
||||
"""
|
||||
if not isinstance(value1, str) or not isinstance(value2, str):
|
||||
return value1 == value2
|
||||
|
||||
# 将标签字符串拆分成集合
|
||||
tags1 = set(value1.strip().split())
|
||||
tags2 = set(value2.strip().split())
|
||||
|
||||
# 比较集合是否相等(忽略顺序)
|
||||
return tags1 == tags2
|
||||
|
||||
def compare_values(value1, value2, field_name=None):
|
||||
"""智能比较两个值,支持JSON标准化、数组比较和标签比较
|
||||
|
||||
Args:
|
||||
value1: 第一个值
|
||||
value2: 第二个值
|
||||
field_name: 字段名(可选,用于判断是否为标签字段)
|
||||
"""
|
||||
# 检查是否为标签字段
|
||||
if field_name and (is_tag_field(field_name, value1) or is_tag_field(field_name, value2)):
|
||||
return compare_tag_values(value1, value2)
|
||||
|
||||
# 检查是否为数组类型
|
||||
if is_json_array_field(value1) or is_json_array_field(value2):
|
||||
return compare_array_values(value1, value2)
|
||||
|
||||
|
Reference in New Issue
Block a user