数据格式转换场景速查表
| 转换场景 | 难度 | 最快方案 | 适用条件 |
| JSON ↔ CSV 互转 | ★☆ | 在线工具(flattened结构) | 扁平JSON、无嵌套、小于10MB |
| 嵌套JSON → 展平CSV | ★★★ | Python pandas.json_normalize | 任意嵌套层级、任意大小 |
| XML → JSON / CSV | ★★☆ | 在线工具 / Python xmltodict | XML结构规范、不含命名空间陷阱 |
| Excel → JSON | ★☆ | 在线工具 / Excel公式拼接 | 单sheet、表头规范 |
| CSV → Excel(不乱码) | ★☆ | Excel Power Query导入 | CSV含中文/特殊字符 |
| 批量多文件格式统一 | ★★☆ | Python脚本 或 命令行jq | 10个以上文件、需重复执行 |
一、在线工具:十秒出结果,适合90%的简单转换
如果你的数据没有嵌套结构、体积不大(小于10MB),在线工具是最快的选择。下面六个工具覆盖了JSON/CSV/XML/YAML之间的所有转换方向。
| 工具 | 支持转换方向 | 亮点 | 局限 |
|---|---|---|---|
| filuni.com | JSON ↔ YAML ↔ XML ↔ CSV 全方向 | 纯本地处理,数据不上传 | 嵌套JSON转CSV只做一层展平 |
| convertcsv.com | CSV ↔ JSON ↔ XML ↔ SQL ↔ Excel | 支持自定义分隔符、字段映射 | 界面英文,嵌套处理有限 |
| wejson.cn | JSON ↔ CSV 双向 | 中文界面,简单直接 | 只有JSON和CSV两种格式 |
| itoolspro.com | JSON ↔ XML ↔ CSV ↔ YAML 全方向 | 支持文件上传,自动检测格式 | 大文件可能有性能瓶颈 |
| allkit.co | 嵌套JSON → 展平CSV(核心卖点) | 专门处理嵌套JSON展平 | 仅JSON→CSV一个方向 |
| csvall.cn | CSV ↔ Excel ↔ JSON ↔ XML ↔ SQL | 纯前端,支持批量文件 | CSV为核心,JSON方向功能偏弱 |
在线工具的"本地处理"标签很重要:如果工具标注了"纯前端处理"或"数据不上传服务器",说明你的数据只在浏览器里运行,不会经过第三方服务器。filuni.com、allkit.co、csvall.cn 都明确标注了这一点。涉及敏感数据时优先选这类工具。
二、嵌套JSON转CSV:在线工具搞不定的终极方案
这是数据格式转换里最常见也最容易翻车的场景。API返回的JSON通常长这样:
典型的嵌套JSON结构——在线工具大概率处理不了
{"orders": [{"order_id": "20260701001","customer": {"name": "张三","email": "zhangsan@email.com","address": {"city": "深圳", "district": "南山区"}},"items": [{"sku": "A001", "name": "机械键盘", "qty": 1, "price": 299},{"sku": "A002", "name": "鼠标", "qty": 2, "price": 89}],"total": 477,"created_at": "2026-07-01T10:30:00Z"}// ... 可能还有几百条]}这种结构有三个难点:①customer对象嵌套一层;②customer.address又嵌套一层;③items是数组,一条订单里有多个商品行。在线工具处理这种结构要么报错,要么把数组转成一坨不可读的字符串。
Python方案:json_normalize 自动展平嵌套对象 + 手动展开数组
import pandas as pdimport json# 读取JSON文件with open("orders.json", "r", encoding="utf-8") as f:data = json.load(f)orders = data["orders"]# 第一步:展平嵌套对象(customer.name → customer_name)# json_normalize自动处理customer和customer.address两层嵌套df = pd.json_normalize(orders,record_path=None, # 主记录就是orders本身meta=[], # 不需要额外元数据sep="_" # 嵌套键用下划线连接)# 结果列名:order_id, customer_name, customer_email,# customer_address_city, customer_address_district,# items, total, created_at# 第二步:展开items数组,每个商品一行# explode把数组拆成多行,类似SQL的UNNESTdf_exploded = df.explode("items")# 第三步:把items里的字典字段拆成独立列items_df = pd.json_normalize(df_exploded["items"])# items_df列名:sku, name, qty, price# 第四步:拼回去result = pd.concat([df_exploded.drop(columns=["items"]).reset_index(drop=True),items_df], axis=1)# 导出result.to_csv("orders_flat.csv", index=False, encoding="utf-8-sig")print(f"完成!{len(orders)}条订单 → {len(result)}行CSV数据")四步操作:展平对象→展开数组→拆数组字段→拼接导出。无论JSON嵌套多深,这个流程都能处理。如果数组里还有数组(items里每个item还有子数组),再套一层explode就行。

json_normalize的三个常用参数
sep="_":嵌套键的连接符,默认是".",改成"_"避免和JSON路径混淆。record_path="items":如果JSON结构是{ "data": [ {...}, {...} ] },record_path="data"直接从data数组开始展平。max_level=2:限制展平深度,超过这个层级的嵌套保持为字典不展开,避免列数爆炸。
三、XML转JSON/CSV:Python一行代码搞定,但有个坑
XML → JSON → CSV,三步串起来
import xmltodictimport jsonimport pandas as pd# XML → 字典(一行代码)with open("data.xml", "r", encoding="utf-8") as f:obj = xmltodict.parse(f.read())# 字典 → JSON字符串(可选,方便查看中间结果)json_str = json.dumps(obj, ensure_ascii=False, indent=2)# 提取实际数据数组(取决于你的XML结构)# 假设XML结构是 - ...
records = obj["root"]["items"]["item"]# 转DataFrame → 导出CSVdf = pd.DataFrame(records)df.to_csv("data.csv", index=False, encoding="utf-8-sig")XML转JSON的常见坑:命名空间
很多XML文件里带命名空间,比如<ns1:order xmlns:ns1="http://example.com">。xmltodict默认会保留命名空间前缀,导致字段名变成ns1:order_id这种带冒号的键,后面处理起来很麻烦。解决方法:xmltodict.parse(xml_str, process_namespaces=True, namespaces={"http://example.com": None})——把命名空间映射为空,字段名就干净了。
四、Excel ↔ JSON:两种方向,两种最快路径
Excel → JSON:在线工具最快
打开 wejson.cn 或 filuni.com,把Excel表格内容复制粘贴进去,选择"CSV→JSON",一键转换。如果需要批量处理多个Excel文件,用Python:pd.read_excel("data.xlsx").to_json("data.json", orient="records", force_ascii=False),一行搞定。

JSON → Excel:别直接双击CSV
JSON转出的CSV如果直接双击打开,中文乱码、长数字变科学计数法、日期格式全错。正确做法:打开空白Excel → "数据"选项卡 → "获取数据" → "从文件" → "从文本/CSV" → 选择文件 → 在预览窗口把"文件原始格式"选为"65001: Unicode (UTF-8)" → 加载。这样中文不乱码、数字不变形。
五、CSV导入Excel不乱码:Power Query是正解
CSV直接双击用Excel打开是数据灾难的起点——中文乱码、长数字变成1.23E+15、前导零消失、日期格式串位。这些问题都源于Excel直接打开CSV时做了自动格式推断,而这个推断经常出错。
Power Query导入CSV的四步操作
- 打开空白Excel → 顶部菜单"数据" → "获取数据" → "从文件" → "从文本/CSV"
- 选择CSV文件后出现预览窗口。左上角"文件原始格式"下拉选 "65001: Unicode (UTF-8)"(这是UTF-8的编码代号)。分隔符默认逗号,如果CSV用制表符或分号分隔,在这里改。
- 点右下角"转换数据"(不是"加载"),进入Power Query编辑器。在这里你可以:把"数字"类型的列手动改成"文本"(避免长数字变科学计数法)、删除空行、拆分合并列、过滤数据。
- 处理好后点"关闭并上载"→ 数据以标准Excel表格形式呈现,所有格式都按你设定的来。
长数字变科学计数法的修复方法
如果你的CSV里有身份证号、订单号这类15位以上的纯数字,在Power Query编辑器里选中该列 → 左上角数据类型下拉 → 选"文本"。这样导入后就是完整的数字字符串,不会变成1.23E+17。这个操作必须在导入阶段做,数据进了Excel再改格式已经晚了——后15位已经变成了0。

六、批量文件格式统一:命令行 + 脚本的自动化方案
如果你有50个JSON文件要全部转成CSV,或者100个XML文件要提取特定字段转JSON,手动一个个搞不现实。
批量JSON → CSV:一个文件夹里所有JSON一键转换
import pandas as pdimport jsonimport globfor filepath in glob.glob("data/*.json"):with open(filepath, "r", encoding="utf-8") as f:data = json.load(f)# 提取实际数据(根据你的JSON结构调整)records = data.get("items", data.get("data", data))if isinstance(records, dict):records = [records]df = pd.DataFrame(records)# 输出同名CSVcsv_path = filepath.replace(".json", ".csv")df.to_csv(csv_path, index=False, encoding="utf-8-sig")print(f"OK: {filepath} → {csv_path}")print(f"全部完成,共处理 {len(glob.glob('data/*.json'))} 个文件")命令行 jq:不需要写Python文件,一行命令JSON→CSV
# 安装jq(Linux/Mac/WSL自带或apt install jq)# 提取JSON数组中特定字段,输出CSVcat data.json | jq -r '.[] | [.id, .name, .email] | @csv' > output.csv# 如果JSON是 {"items": [...]} 结构cat data.json | jq -r '.items[] | [.id, .name, .price] | @csv' > output.csvjq的优点是极轻量——一个几百KB的二进制文件,不需要Python环境。特别适合在服务器上临时处理数据。缺点是嵌套结构复杂时语法较难写,不如Python直观。
七、不同场景的推荐方案速查
| 你的场景 | 推荐方案 | 原因 |
| 扁平JSON转CSV,一次性的 | 在线工具(filuni.com / wejson.cn) | 打开网页→粘贴→点转换→下载,30秒搞定 |
| 嵌套JSON转CSV,多层级的 | Python pandas.json_normalize | 在线工具搞不定的嵌套结构,Python都能处理 |
| XML转JSON或CSV | Python xmltodict + pandas | xmltodict一行转字典,pandas一行转表格 |
| Excel表格转JSON | 在线工具 / pd.read_excel | 单文件用在线工具,批量用Python |
| CSV导入Excel不乱码 | Excel Power Query导入 | 编码可选、格式可控,彻底告别乱码和数字变形 |
| 批量50+文件格式统一 | Python glob循环 或 jq命令 | 脚本写一次,以后每次跑几秒钟 |
| 服务器上临时处理,无Python | jq 命令行 | 一个二进制文件,JSON查询和转换都支持 |
最后说句实在的
数据格式转换这件事,工具选择不是重点——重点是先看一眼数据结构再动手。绝大多数翻车现场都是同一个原因:没看JSON有几层嵌套就直接往在线工具里扔,结果CSV列名对不上、数据缺胳膊少腿,自己还不知道。
养成习惯:拿到数据后先用json.dumps(obj, indent=2)[:500]打印前500个字符,看清楚结构。扁平的一层结构→在线工具秒出结果;嵌套的→直接上Python,别在在线工具上浪费时间。
还有就是编码。中文数据的转换输出统一用encoding="utf-8-sig"——多一个-sig是给文件加BOM头,Excel打开能自动识别UTF-8编码,省掉每次手动选编码的步骤。
