You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多嵌套模式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:05:11