将CSV转换为JSON
把CSV文件或粘贴的表格转成干净的JSON——数字和布尔值带有类型,点号分隔的标题会构建出嵌套对象,结构正是您的代码所需要的样子。
- 绝不存储
- 无需排队,无需等待
- 无需注册,无水印
使用方法
添加CSV
拖放.csv或.tsv文件,或者直接粘贴数据。分隔符和编码会自动检测。
选择结构
对象数组、数组的数组、以第一列为键的对象,或JSON Lines——还可以设置类型、空值和缩进。
复制或下载
把JSON复制到剪贴板,或保存为.json文件。
CSV比看上去更含糊的地方
CSV并没有真正的标准——只有一份2005年的建议性规范,描述了大多数工具的做法,而很多软件的做法却不一样。所以第一步是弄清文件到底是什么样的:值是用逗号、分号还是制表符分隔的(欧洲地区导出的是分号,因为逗号是他们的小数点符号),第一行是否是标题,引号是怎么处理的。带引号的字段可以合法地包含逗号、换行符和成对的引号,这就是为什么按逗号拆分是错误的读取方式,也是为什么简陋的解析器会弄坏任何包含地址的文件。
类型是第二步,而JSON在这方面有CSV所没有的讲究。CSV单元格里只有文本;JSON则区分数字、字符串、布尔值和null。必须有人决定哪个是哪个,而真正要紧的是那些会出错的决定:前导零在邮编、电话号码或账户编号中是有意义的,所以01234这样的值必须保持为字符串,而不能变成数字1234。长标识符也是如此,作为JSON数字超过大约九千万亿时就会丢失精度。
日期保持为原来的文本,因为JSON没有日期类型。2024-03-05会输出为字符串"2024-03-05",这是诚实的做法,而不是局限——另一种选择是猜测,而猜测正是03/05/2024在一个国家变成3月、在另一个国家变成5月的原因。是否转换日期,应该由使用JSON的程序来决定,它知道自己需要什么格式。
编码是最后一个悄无声息的故障点。CSV不会记录自己的字符编码,所以一个以Windows-1252保存、却按UTF-8读取的文件,恰恰会在包含带重音名字的那些行里出现乱码——而Excel在文件开头添加的字节顺序标记(BOM),如果不加处理,会以多余字符的形式出现在第一个字段名里。这两点都是CSV本身的特性,而不是某个转换工具的问题。
如果您需要的是别的
对于大到无法放进内存的文件,或者任何需要脚本化的任务,csvkit 正是为此而生:csvjson --stream data.csv 可以增量转换,csvlook 让您先看清数据的样子,csvclean 能修复那些会破坏后续所有流程的不规整行。Miller——mlr --icsv --ojson cat data.csv——速度相当快地完成同样的工作,还能处理按行分隔的JSON,而这正是大多数数据管道真正需要的格式。
当类型比便利更重要时,请在代码中完成转换,并显式声明类型而不是推断。使用Python的 pandas 配合显式的 dtype 映射,或者用一个带数据结构定义的小脚本,就能确保邮编仍是邮编、标识符保留每一位数字——对于一个没有完整看过的文件,任何自动推断都无法保证这一点。
常见问题
应该选择哪种JSON结构?
对象数组——[{"name": "Ada", "age": 36}]——几乎适用于所有API和库。数组的数组最紧凑。键控对象方便代码按ID查找记录。JSON Lines每行一条记录,适合流式处理工具、BigQuery和日志管道。
数字和布尔值是怎么判断的?
按列判断一次:只有一列中的每个值都是数字时,该列才会变成数字,所以“007”和7绝不会混在同一个键下。带前导零的值,以及长到JavaScript无法精确表示的ID,都保持为字符串。true和false会变成布尔值,空单元格变成null——也可以按您的偏好变成空字符串,或者直接省略。
能生成嵌套的JSON吗?
能。开启嵌套后,address.city这样的标题会变成{"address": {"city": …}},而tags.0、tags.1会变成数组。
我的数据会被存储吗?
不会。不会发送到任何地方,也不存储任何文件。
分号、制表符和其他编码怎么办?
逗号、分号、制表符和竖线都会自动检测,UTF-8、UTF-16和旧版Windows编码也一样,所以带重音的文字和非拉丁文字都能完整保留。
列名重复或为空怎么办?
重复的列名会加上编号(name、name_2),空标题会按位置命名(column_3),所以不会有值被覆盖,并且会告诉您做了哪些更改。
小贴士: 日期保持为文件中的文本,因为JSON没有日期类型。非常大的文件受限于浏览器的内存。
把这个工具放到您的网站上
博客、课程页面或帮助文章均可免费使用。粘贴一段代码,访客就能直接在您的页面上使用。