多嵌套模式JSON属性提取与Excel行元素对比技术咨询
解决方案:提取JSON最底层属性并与Excel对比
一、核心思路
通过递归遍历JSON结构,提取所有最底层属性(即值不再是字典/列表的键值对),再读取Excel行数据并转换为字典格式,最后根据需求完成两者的属性存在性、值匹配度等对比。
二、递归提取JSON底层属性
不管JSON嵌套模式如何(如Service1的多层字典、Service2的字典嵌套列表),递归遍历是通用的处理方式。
示例JSON结构
Service1示例:
{ "user": { "id": 123, "info": { "name": "Alice", "age": 30 }, "tags": ["admin", "user"] } }Service2示例:
{ "order": { "order_id": "ORD-001", "details": [ { "product": "Laptop", "price": 999 }, { "product": "Mouse", "price": 25 } ] } }
递归提取函数代码
def extract_bottom_level_properties(data, parent_key="", result=None): if result is None: result = {} # 处理字典类型,拼接父键与当前键 if isinstance(data, dict): for key, value in data.items(): new_key = f"{parent_key}.{key}" if parent_key else key extract_bottom_level_properties(value, new_key, result) # 处理列表类型,添加索引后缀区分元素 elif isinstance(data, list): for idx, item in enumerate(data): new_key = f"{parent_key}[{idx}]" extract_bottom_level_properties(item, new_key, result) # 底层属性,存入结果字典 else: result[parent_key] = data return result
三、读取Excel数据并转换为字典
使用pandas快速读取Excel,将每行数据转换为字典格式,方便后续对比:
import pandas as pd def read_excel_to_dict(excel_path): df = pd.read_excel(excel_path) # 将每行数据转为字典,返回行数据列表 return df.to_dict("records")
四、属性对比逻辑
根据需求实现不同对比规则,以下是基础对比逻辑示例:
def compare_properties(json_props, excel_row): # 找出JSON独有的属性 json_only = [key for key in json_props if key not in excel_row] # 找出Excel独有的属性 excel_only = [key for key in excel_row if key not in json_props] # 找出属性存在但值不匹配的项 value_mismatch = [] common_keys = set(json_props.keys()) & set(excel_row.keys()) for key in common_keys: # 注意处理类型差异,比如JSON的int和Excel的float if str(json_props[key]) != str(excel_row[key]): value_mismatch.append((key, json_props[key], excel_row[key])) return { "json_only_properties": json_only, "excel_only_properties": excel_only, "value_mismatches": value_mismatch }
五、完整流程示例
import json # 1. 加载并解析JSON文件 with open("service1.json", "r", encoding="utf-8") as f: json_data = json.load(f) json_bottom_props = extract_bottom_level_properties(json_data) # 2. 加载Excel数据 excel_rows = read_excel_to_dict("data.xlsx") # 3. 逐行对比并输出结果 for row_idx, row in enumerate(excel_rows): print(f"=== 第{row_idx+1}行对比结果 ===") comparison = compare_properties(json_bottom_props, row) print(f"JSON独有的属性: {comparison['json_only_properties']}") print(f"Excel独有的属性: {comparison['excel_only_properties']}") print(f"值不匹配的属性: {comparison['value_mismatches']}")
六、注意事项
- 若Excel列名与JSON属性名存在映射关系,可提前定义映射表,对比前完成属性名转换
- 处理数值类型时,需注意JSON与Excel的类型差异(如JSON的
int和Excel的float),可统一转为字符串后再对比 - 对于JSON中重复结构的列表元素(如Service2的
details),提取后的属性会带索引后缀(如order.details[0].product),Excel列名需对应设置才能匹配
内容的提问来源于stack exchange,提问作者Dev_Shekhar15
相关产品推荐
相关产品推荐

