数据格式
JSON数组 vs CSV vs 逐行列表:你应该使用哪种格式?
比较JSON数组、CSV和逐行列表。了解转义、嵌套数据、电子表格使用以及数据项目中的转换陷阱。
当你为电子表格、API或开发者工具处理数据列表时,通常需要在几种简单的文本格式之间做出选择。JSON数组、CSV文件和逐行列表(每行一项)是最常见的几种。每种格式都有其优势和局限性,影响你处理转义、嵌套结构和人工编辑的方式。
JSON数组对机器友好且支持丰富的数据类型;CSV是电子表格导入导出的通用格式;逐行列表是手动编辑和版本控制的最简单选择。正确的选择取决于你是需要保留结构、与非技术用户共享,还是最小化文件大小。
本指南从转义、嵌套数据、电子表格集成和转换陷阱等方面对这三种格式进行了比较。你将学习如何有效使用每种格式,并避免在它们之间移动数据时的常见错误。
理解三种格式
JSON数组是用方括号括起来的有序值集合。它可以包含字符串、数字、布尔值、对象和嵌套数组。CSV(逗号分隔值)将表格数据表示为由逗号分隔的行和字段,通常带有可选的标题行。逐行列表是最简单的形式:每行一个值,没有分隔符,没有列结构。
- JSON数组处理异类数据和嵌套对象。
- CSV是电子表格和数据库导出的标准。
- 逐行列表最适合简单的有序集合,如电子邮件地址或文件名。
["apple", "banana", "cherry"]fruit,quantity
apple,3
banana,5
cherry,2apple
banana
cherry使用JSON数组
JSON数组在Web API和配置文件中广泛使用,因为它们支持嵌套结构。数组可以包含具有多个属性的对象,这使得表示现实世界实体变得容易。该格式很严格:尾随逗号、未加引号的键或括号不匹配都会导致解析错误。
对于简单列表,JSON比逐行列表更冗长,但其机器可读性和对多种数据类型的支持通常超过了开销。转义通过在字符串内使用反斜杠处理:双引号变为\",反斜杠变为\\,换行符变为\n。
- 优点:支持复杂嵌套,语言无关,自描述。
- 缺点:更冗长,需要验证,对大型数据集不太适合人工编辑。
[
{"name": "Alice", "email": "[email protected]"},
{"name": "Bob", "email": "[email protected]"}
]["line1\nline2", "path\\to\\file", "She said \"hello\""]使用CSV
CSV文件是电子表格和数据库之间交换数据的事实标准。每行代表一条记录,字段由分隔符分隔——通常是逗号,但在逗号用作小数分隔符的地区,则使用分号。根据RFC 4180,包含分隔符、双引号或换行符的字段必须用双引号括起来。
CSV中的数据总是以字符串形式表示;数字、日期和布尔值可能被不同程序以不同方式解释。标题行很常见但不是必需的。CSV最大的挑战是处理特定于区域的分隔符和编码(UTF-8、UTF-8 BOM或ISO-8859-1)。
- 优点:电子表格原生支持,易于以表格形式查看,紧凑。
- 缺点:数据类型有限(全是字符串),无嵌套结构,引号转义可能令人困惑。
"Name","Comment"
"Smith, John","He said ""hello"""使用逐行列表
逐行列表是最简单的基于文本的数据格式:每行一个值,没有分隔符,没有引用规则。它非常适合每项为单个字符串且不含换行符的集合,例如电子邮件地址、域名、文件名或产品代码。这种格式非常人性化,并且与grep、sort和uniq等命令行工具配合良好。
由于没有转义,逐行列表不能包含多行值。如果某个项目可能包含换行符,则必须使用其他格式,或按照约定将换行符编码为字面上的反斜杠-n(或其他占位符)。许多编辑器和版本控制系统能干净地处理逐行列表,因为每个更改都是逐行可见的。
- 优点:人类可读,易于排序和去重,典型值无需转义。
- 缺点:仅适用于单字段数据,没有约定就不支持多行项目。
[email protected]
[email protected]
[email protected]三种格式的转义和引用
每种格式处理特殊字符的方式不同。在JSON中,任何字符串都可以包含反斜杠转义序列:\"表示双引号,\\表示反斜杠,\n表示换行符,\t表示制表符。解析器始终解释这些序列,这使得JSON明确但手写起来更困难。
CSV依靠外部双引号来保护包含特殊字符的字段。如果字段包含双引号,则将其加倍(""变为一个字面量的双引号)。逐行列表没有转义机制;如果数据包含换行符,结构就会破坏。在格式之间转换时,理解这些差异至关重要。
- JSON在字符串内使用反斜杠转义。
- CSV对包含逗号、换行符或引号的字段使用双引号。
- 逐行列表假设数据中无换行符;嵌入的换行符无法表示。
JSON: "He said \"hello\"\nand left."
CSV: "He said ""hello""
and left."电子表格集成与导入/导出
CSV是电子表格用户最直接的格式。大多数电子表格应用程序(Microsoft Excel、Google Sheets、LibreOffice Calc)可以直接打开CSV文件,尽管它们可能误解分隔符或编码。为了获得一致的结果,将CSV文件保存为带有字节顺序标记(BOM)的UTF-8,并使用逗号(或根据区域要求使用分号)。
JSON数组可以使用内置工具如Power Query(Excel)或编写简短脚本导入电子表格。逐行列表通常粘贴到单列中;如果列表包含分隔符,你可能需要使用‘分列’功能。对于每种格式,注意自动数据转换:数字中的前导零、日期字符串或可能丢失精度的大数字。
- 打开Excel并选择文件 > 打开。
- 选择你的CSV文件。如果数据显示不正确,使用文本导入向导指定分隔符和编码。
- 对于JSON,使用数据 > 获取数据 > 从文件 > 从JSON。
- 对于逐行列表,将数据粘贴到一列中,然后选择该列,如果需要进一步拆分,使用数据 > 分列。
- CSV:验证分隔符和字符编码;带有BOM的UTF-8可以提高与某些Excel版本的兼容性。
- JSON:导入前验证结构,以便及早捕获语法错误。
- 逐行列表:当必须保留前导零时,粘贴到文本格式的列中。
常见转换陷阱及如何避免
如果不小心,在这些格式之间转换通常会导致数据丢失。将嵌套的JSON数组扁平化为CSV迫使你选择保留哪些属性,丢弃其他属性。将逐行列表转换为CSV时,每行成为一个字段,但如果该行包含逗号或双引号,则必须正确引用以保持为单个列。
验证是关键。JSON文件应使用linter验证,以捕获尾随逗号或未加引号的键。CSV文件应检查行长度一致性和正确的引用。逐行列表应有尾随换行符,除非有意为之,否则不应有空行。使用专用的转换工具有助于避免这些陷阱。
- 1. 确定源格式的结构(平面或嵌套)。
- 2. 如果从JSON转换,扁平化任何嵌套对象或数组。
- 3. 对于CSV,确保根据需要存在标题,并且字段正确引用。
- 4. 对于逐行列表,确认项目不包含换行符;如果包含,则对其进行编码或切换格式。
- 5. 通过简单的解析测试验证输出。
- 在转换为CSV之前,扁平化JSON中的嵌套对象。
- 如果CSV字段可能包含逗号或换行符,始终引用它们。
- 转换前使用linter验证JSON。
- 检查逐行列表中的空行或尾随空格。
Source JSON: [{"name": "Alice", "tags": ["dev", "admin"]}]
Flattened CSV: name,tags
Alice,"[""dev"",""admin""]""Name"
"Smith, John"选择格式:决策指南
数据的最佳格式取决于其创建、消费和维护方式。当数据具有嵌套结构,或当你在已经使用JSON的应用程序之间交换数据时,使用JSON数组。当目标受众使用电子表格,或者你需要普遍接受的表格格式时,选择CSV。对于人们将使用基本文本编辑器编辑的简单平面集合,选择逐行列表。
- API数据 → JSON。
- 电子表格导入 → CSV。
- 纯列表(电子邮件、代码) → 逐行列表。
- 最大互操作性 → CSV(所有电子表格应用程序都支持)。
- 版本友好差异 → 逐行列表。
总结
对于结构化或嵌套的应用程序数据,选择JSON;对于真正的行列数据,选择CSV;对于值不包含换行符的简单平面集合,选择逐行列表。转义和导入行为与可见的分隔符同样重要。
浏览器列表转换器对于原始JSON数组和字面分隔符更改很有用。对于引用或多行CSV,请使用正确的CSV解析器,并在丢弃源格式之前验证目标格式。