如何在Python中将含嵌套缺失字段的JSON转换为CSV文件
嵌套且字段缺失的JSON转CSV解决方案
要将包含嵌套结构、部分字段缺失的JSON转换为包含所有出现过的字段的CSV,可通过Python实现,确保缺失字段对应位置留空,具体步骤和代码如下:
核心思路
- 全量提取字段:遍历整个JSON数据集,收集所有层级的字段(包括
infos数组内的单键对象、additional infos嵌套对象里的字段),确保表头覆盖所有可能的字段。 - 逐行填充数据:对每个JSON对象,匹配所有已收集的字段,存在的字段提取对应值,不存在的字段设为空字符串。
- 写入CSV文件:使用Python内置的
csv模块完成格式规范的文件写入。
完整代码实现
import json import csv # 读取JSON数据(可替换为从文件读取:with open('input.json', 'r') as f: data = json.load(f)) json_str = ''' [ { "infos": [ { "localisation": "Kassel" }, { "date": "01.08.2023" }, { "places": "1 freier Platz" } ], "applying email": "exemple@starke.ma", "additional infos": { "name": "jhon", "position": "RH", "email": "email@email.com" } }, { "infos": [ { "places": "1 freier Platz" } ], "applying email": "", "applying link": "www.exemple.com", "additional infos": { "name": "jhon", "position": "RH", "email": "email@email.com" } } ] ''' data = json.loads(json_str) # 收集所有字段(去重) all_fields = set() for item in data: # 处理顶层非嵌套字段 for key in item.keys(): if key not in ["infos", "additional infos"]: all_fields.add(key) # 提取infos数组内的所有字段 for info_obj in item.get("infos", []): all_fields.update(info_obj.keys()) # 提取additional infos内的所有字段 all_fields.update(item.get("additional infos", {}).keys()) # 转为有序列表(可选,按字母排序保证表头顺序稳定) all_fields = sorted(all_fields) # 写入CSV文件 with open('output.csv', 'w', newline='', encoding='utf-8') as csv_file: writer = csv.DictWriter(csv_file, fieldnames=all_fields) writer.writeheader() for item in data: row_data = {} for field in all_fields: # 优先匹配顶层字段 if field in item: row_data[field] = item[field] # 匹配infos里的字段 elif any(field in info for info in item.get("infos", [])): for info in item["infos"]: if field in info: row_data[field] = info[field] break # 匹配additional infos里的字段 elif field in item.get("additional infos", {}): row_data[field] = item["additional infos"][field] # 字段缺失时留空 else: row_data[field] = "" writer.writerow(row_data)
代码说明
- 字段收集:通过遍历JSON的每个层级,将所有出现过的字段存入集合自动去重,确保表头包含所有可能的字段。
- 数据填充:按顶层字段→
infos字段→additional infos字段的顺序匹配,找不到对应字段时自动设为空字符串。 - CSV写入:使用
DictWriter可以直接按表头字段映射行数据,避免手动拼接带来的格式错误。
生成的CSV表头及内容示例
表头:applying email,applying link,date,email,localisation,name,places,position
内容:
applying email,applying link,date,email,localisation,name,places,position exemple@starke.ma,,01.08.2023,email@email.com,Kassel,jhon,1 freier Platz,RH ,www.exemple.com,,email@email.com,,jhon,1 freier Platz,RH
内容的提问来源于stack exchange,提问作者ibrahim maghfoul
相关产品推荐
相关产品推荐

