嵌套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
相关产品推荐
相关产品推荐

