json转csv关键在预处理和结构对齐:需用json_normalize()展平嵌套、处理数组、统一缺失值与混合类型,并注意编码、时间字段格式及大文件流式写入。

JSON 转 CSV 不是简单地把字段拼成一行——嵌套结构、空值、类型不一致、数组字段都会让 pandas.read_json() 或 json.loads() + csv.writer 直接报错或丢数据。关键在预处理和结构对齐。
处理嵌套 JSON 字段(如 "address": {"city": "Beijing", "zip": "100000"})
CSV 是扁平结构,不能直接存字典。必须展开嵌套,否则 pandas.json_normalize() 会跳过或报 ValueError: arrays must all be same length。
- 用
pandas.json_normalize(data, sep="_")自动打平,sep="_"避免列名含点号(如address.city→address_city),方便后续处理 - 如果只有一层嵌套但想手动控制,可用字典推导:
{f"{k}_{sk}": sv for k, v in item.items() if isinstance(v, dict) for sk, sv in v.items()},再合并原字典的非 dict 字段 - 遇到
"tags": ["a", "b"]这类数组,json_normalize默认转成字符串["a", "b"];若需拆成多行,得先用pd.json_normalize的record_path参数单独提取,再merge回主表
应对缺失字段和混合类型(如有的对象有 "score",有的没有;或 "score" 有时是 int,有时是 null)
pandas 读取时默认把缺失字段填为 NaN,但混合类型会让整列变成 object,影响数值计算;导出 CSV 后 Excel 可能误判格式。
- 加载后立刻用
df = df.convert_dtypes()启用 nullable 类型(Int64,string,boolean),比astype()更安全 - 对疑似数值列,用
pd.to_numeric(df["score"], errors="coerce")强制转数字,无效值变NaN;不要用astype(float),它遇到"N/A"直接崩 - 导出前检查:运行
df.dtypes,确认关键列不是object;若有,说明存在类型冲突,得回溯原始 JSON 找异常值
用 csv.DictWriter 手动写入(绕过 pandas,适合大文件或内存受限)
当 JSON 文件超 500MB 或字段极不规则,pandas 容易 OOM。csv.DictWriter 流式写入更稳,但必须提前知道所有可能字段名。
- 第一遍扫描 JSON 列表,收集全部键名:
all_keys = set().union(*[d.keys() for d in data]),再排序确保列序固定 - 写入时用
writer.writerow({k: d.get(k, "") for k in all_keys}),避免KeyError;空值统一填空字符串,而非None(否则 CSV 里出现None字面量) - 注意编码:打开文件必须指定
encoding="utf-8-sig",否则中文 Windows Excel 打开乱码;别用"utf-8"
最常被忽略的是时间字段——JSON 里的 "created_at": "2024-03-15T08:22:10Z" 用 json_normalize 会原样当字符串写入,Excel 不识别为日期。需要额外调用 pd.to_datetime() 并用 date_format 参数控制输出格式,否则 CSV 里存的是带时区的 ISO 字符串,下游系统解析容易出错。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











