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

嵌套JSON归一化为DataFrame后与合法键列表的校验方案问询

嵌套JSON与简单合法键列表的校验实现方案

方案1:直接校验原始嵌套JSON(推荐,不受归一化逻辑影响)

直接从原始JSON中提取所有层级的键再校验,不需要依赖DataFrame的列名规则,通用性更强。

  • 第一步:实现递归提取任意嵌套JSON所有键的工具函数
def extract_all_keys(nested_data):
    keys = set()
    if isinstance(nested_data, dict):
        for k, v in nested_data.items():
            keys.add(k)
            keys.update(extract_all_keys(v))
    elif isinstance(nested_data, list):
        for item in nested_data:
            keys.update(extract_all_keys(item))
    return keys
  • 第二步:替换原有校验逻辑
import logging

try:
    # 替换your_original_json为你用来生成df的原始嵌套JSON数据
    all_exist_keys = extract_all_keys(your_original_json)
    invalid_keys = all_exist_keys - set(self.valid_keys)
    if invalid_keys:
        raise KeyError(f"以下键未在合法键列表中找到:{', '.join(invalid_keys)}")
except Exception as e:
    logging.error(f"键校验执行出错\n错误信息:{e}")

方案2:基于现有DataFrame列名校验(仅适用于无法获取原始JSON的场景)

先根据你归一化时的列名拼接规则,把拼接后的列名拆分为原始嵌套键片段,再逐一校验。以你示例的大驼峰拼接规则为例:

  • 第一步:实现大驼峰列名拆分函数
import re

def split_camel_col(col_name):
    # 正则匹配大驼峰的每个独立单词片段
    key_fragments = re.findall(r'[A-Z](?:[a-z]+|[A-Z]*(?=[A-Z]|$))', col_name)
    return [frag.strip() for frag in key_fragments if frag.strip()]
  • 第二步:替换原有校验逻辑
import logging

try:
    invalid_keys = set()
    for col in self.df.columns:
        key_fragments = split_camel_col(col)
        for frag in key_fragments:
            if frag not in self.valid_keys:
                invalid_keys.add(frag)
    if invalid_keys:
        raise KeyError(f"以下键未在合法键列表中找到:{', '.join(invalid_keys)}")
except Exception as e:
    logging.error(f"键校验执行出错\n错误信息:{e}")

注意:如果列名拼接时使用了其他规则(比如下划线分隔、固定前后缀拼接),仅需要调整拆分函数的匹配逻辑即可,核心校验逻辑无需修改。

内容的提问来源于stack exchange,提问作者Anouar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:18:03