CSV / JSON 互转工具
CSV 与 JSON 双向转换:状态机解析 CSV(支持引号包裹、字段内换行、引号转义), JSON 对象数组展平为点号路径列。配表格预览、自定义分隔符、Excel 兼容的 BOM 下载。 所有解析在浏览器本地完成,无需上传。
常见问题
CSV 和 JSON 各有什么优劣?什么时候该用哪个?
CSV(Comma-Separated Values)是表格数据的轻量格式,每行一条记录、字段用逗号分隔, 优势是体积小、Excel 直接可读、人类可读,劣势是无类型系统(所有值都是字符串)、 不支持嵌套结构、字段含逗号或换行需引号转义。 JSON(JavaScript Object Notation)支持对象、数组、嵌套结构、数字 / 布尔 / null 类型, 优势是结构化、类型丰富、与 API 兼容,劣势是体积较大、Excel 不能直接打开。 经验法则:表格数据交换用 CSV,API 与结构化数据用 JSON。
CSV 字段里有逗号或换行怎么办?工具能正确处理吗?
CSV 标准规定:字段若包含分隔符(逗号)、双引号 " 或换行符,必须用双引号包裹整个字段,
字段内原有的双引号需转义为两个连续双引号 ""。例如含换行的字段:
"上海<换行>浦东"。本工具完全实现 RFC 4180 标准的状态机解析器,
可正确处理引号包裹、引号转义、字段内换行、CRLF / LF 行结束符。如果输入的引号未闭合,
工具会给出错误提示并指出大致行号,便于定位问题。
JSON 中的嵌套对象(如 user.address.city)转 CSV 时会怎么处理?
本工具会把嵌套对象展平为点号路径列。例如 JSON 对象
{ "user": { "name": "张三", "age": 28 } }
转 CSV 后会有两列:user.name 和 user.age。
数组则用 [index] 标记,如 tags[0]、tags[1]。
多个对象的键会取并集作为表头,缺失的字段填空字符串。这样处理后 CSV 仍是表格结构,
可直接在 Excel 中查看,但列名会比较长,如需还原嵌套结构建议保留 JSON。
为什么下载的 CSV 文件在 Excel 中打开是乱码?
这是 Excel 的老问题:Excel 默认按系统编码(GBK / GB2312)解析 CSV,
而现代工具生成的 CSV 多为 UTF-8 编码,导致中文乱码。解决方案是在文件开头加 UTF-8 BOM 头
(\uFEFF 三字节),Excel 识别到 BOM 后会自动按 UTF-8 解析。
本工具的「下载」按钮已自动添加 BOM 头,下载的 converted.csv 可直接在 Excel 中打开,
中文显示正常。若用其他工具下载 CSV 出现乱码,可手动用记事本打开 → 另存为 → 编码选 UTF-8 with BOM。
支持哪些分隔符?逗号、分号、Tab、管道符有什么区别?
本工具支持 4 种分隔符:逗号 ,(RFC 4180 标准,最通用,Excel 默认)、
分号 ;(欧洲国家常用,因欧洲数字用逗号作小数点)、
Tab \t(即 TSV 格式,适合字段中常含逗号的数据)、
管道符 |(日志、配置文件常用,避免与文本中的逗号冲突)。
切换分隔符后实时转换会立即重新解析。注意:JSON → CSV 时若值中含所选分隔符,会自动用引号包裹,
不需要手动处理。
CSV 转出来的 JSON 数字、布尔为什么都变成了字符串?
这是 CSV 格式本身的限制:CSV 没有类型系统,所有值在 CSV 中都是字符串。
例如 age 列的 28 在 CSV 中只是字符 "2" 和 "8",无法区分是数字还是字符串。
因此 CSV → JSON 时默认所有字段都是字符串类型。如果需要还原为数字 / 布尔,勾选工具栏的「智能类型」开关,
工具会自动将符合规则的字段转换为对应类型:
- 数字:
28→28(number)、3.14→3.14、-5→-5、1e3→1000 - 布尔:
true/false(不区分大小写)→ 布尔值 - null:
null/NULL/None/nil→null,空字符串也转为null - 字符串:其余所有内容保留为字符串
启用后表格预览中每个单元格右上角会显示类型徽章(N=数字 / B=布尔 / ∅=null / S=字符串), 并对前导零数字、超大整数等风险场景给出提示。若不想用工具自动转换,也可在 JSON 输出后用代码二次处理:
data.forEach(row => {
row.age = Number(row.age);
row.active = row.active === 'true';
});
反过来 JSON → CSV 时,数字 28 会被 String(28) 转为字符串 "28" 写入 CSV,
这是正常行为,不是 bug。
智能类型推断会误判吗?哪些场景需要小心?
智能类型推断采用保守策略:宁可保留字符串也不误判。以下场景工具会主动保留为字符串并给出风险提示:
- 前导零数字(如
021000邮政编码、01012345678电话号码、007编号): 转 number 会丢失前导零(021000→21000),工具保留为字符串并提示「前导零数字」 - 超过
Number.MAX_SAFE_INTEGER(2^53-1 = 9007199254740991)的大整数: JavaScript number 类型无法精确表示,转 number 会丢失末尾精度(如9007199254740993→9007199254740992), 工具保留为字符串并提示「整数超过安全范围」 - 混合内容(如
010-12345678、v1.0、1,234.56):不符合数字格式,保留为字符串
常见陷阱:ID 编号、订单号、身份证号、银行卡号等长数字串虽然全是数字,但实质是标识符而非数值,
转 number 后既可能丢失精度也可能丢失前导零。工具对超过安全整数范围的大数字会主动保留为字符串,
但 16 位以内的纯数字 ID(如 12 位订单号 202601011234)会被转为 number——
若你的数据是 ID 类,建议关闭「智能类型」开关或导出后用代码还原为字符串。
风险提示区位于表格预览下方,黄色背景,列出所有保留为字符串的字段及原因,最多显示 20 条。
为什么 021000 邮政编码转 JSON 后还是字符串而不是数字?
这是有意设计,不是 bug。邮政编码 021000 以 0 开头,
如果转为 number 会变成 21000(丢失前导零),导致:
- 邮政编码含义改变(
021000是上海,21000不存在) - 电话号码
01012345678变成1012345678(区号010丢失前导零) - 编号
007变成7(编号含义丢失)
因此工具对长度 > 1 且以 0 开头的纯数字串主动保留为字符串,并在风险提示区标注「前导零数字」。
如果你确认数据是纯数值(如 0、0.5、0.0),
这些不会被前导零规则拦截(0 长度为 1,0.5 含小数点不符合 ^0\d+$ 规则)。
类似地,超过 Number.MAX_SAFE_INTEGER(9007199254740991)的大整数也会保留为字符串,
避免 JavaScript 精度丢失。
能处理多大的 CSV 文件?有行数限制吗?
本工具的解析器是纯前端 JavaScript 实现,性能受浏览器内存限制。 实测 1 万行 × 10 列的 CSV(约 1MB)可在 200ms 内完成解析,10 万行约需 2-3 秒。 表格预览区只渲染前 50 行避免 DOM 节点过多导致卡顿,但完整数据仍会写入 JSON 输出框。 超过 10 万行的超大 CSV 建议用专业工具(如 Python pandas、命令行 csvkit)处理。 所有解析在浏览器本地完成,数据不会上传,可放心处理敏感数据。
数据会上传到服务器吗?
不会。本工具完全在浏览器内运行,所有 CSV 解析、JSON 序列化、文件下载逻辑由 JavaScript 在你本地执行, 输入的数据不会发送到任何服务器。这对于处理用户数据、商业数据、隐私数据尤其重要, 可避免数据泄露风险。但请注意:浏览器历史记录、屏幕截图、共享设备可能留下痕迹, 如需彻底保密请在隐私模式中使用。