嵌套JSON可选字段提取及构建pandas DataFrame的实现方案
可选字段提取实现方案
原遍历逻辑存在两个核心问题:
- 逐字段触发append的写法,会导致可选字段缺失时,对应列表长度和其他列表不一致,后续转pandas DataFrame时会出现行错位、索引不对齐的问题
- 无键存在性校验,碰到fields列表里没有对应label的场景,循环走完都不会给对应列表补空值,甚至可能触发KeyError
实现思路
针对每个用户条目,先把该条目下所有fields按label整理成临时键值映射,再统一从映射中取需要的字段值,取不到就补None,保证每个条目处理完,所有目标列表同步追加一次值,长度完全对齐。
完整优化代码
# 初始化所有目标字段列表 names = [] genders = [] field_of_studies = [] for response in users: # 提前解析响应里的items字段,不存在则返回空列表,避免KeyError items = response.json().get("items", []) for item in items: # 构建当前用户的字段映射表:key为字段label,value为完整字段字典 field_map = {} for field in item.get("fields", []): field_label = field.get("label") if field_label: field_map[field_label] = field # 提取姓名字段值 name_target = field_map.get("Name and Surname") names.append( name_target["values"][0]["value"] if (name_target and name_target.get("values")) else None ) # 提取性别字段值 gender_target = field_map.get("Gender") gender_val = None if gender_target and gender_target.get("values"): value_body = gender_target["values"][0].get("value") if isinstance(value_body, dict): gender_val = value_body.get("text") genders.append(gender_val) # 提取可选的专业字段,不存在就补None study_target = field_map.get("Field of Studies") study_val = None if study_target and study_target.get("values"): value_body = study_target["values"][0].get("value") if isinstance(value_body, dict): study_val = value_body.get("text") field_of_studies.append(study_val)
方案优势
- 数据完全对齐:每个用户条目处理完成后,三个列表都会追加1个值,最终三个列表长度完全一致,直接传给pandas就可以生成结构正确的DataFrame
- 容错性强:所有取值场景都加了存在性判断,不管是缺整个字段、字段下无values、values下无有效value的情况,都会兜底返回
None,不会触发代码运行报错 - 扩展性好:后续要新增提取的字段时,只需要在取值部分加一段对应逻辑,不需要修改前面遍历fields的核心循环
额外优化:如果后续要提取的字段越来越多,可以把需要匹配的label、取值路径做成配置表,循环批量生成对应列表,不用反复写重复的判断逻辑。
内容的提问来源于stack exchange,提问作者user9951164
相关产品推荐
相关产品推荐

