JSON 和 CSV 是存储和传输结构化数据的两种最常见格式,几乎所有与数据打交道的人都会不断面对两者之间的抉择:API 返回的是 JSON,电子表格期望接收 CSV,而爬虫通常可以输出任一格式。在小型示例中,两者看起来可以互换,但它们实际上做出了截然相反的取舍,选错格式会在后续导致文件臃肿、数据导出时损失信息,或解析代码与格式"打架"。

本文将介绍每种格式的实质,从重要维度(结构、可读性、嵌套、大小、工具支持和典型用途)对两者进行对比,然后给出何时使用各自格式的明确规则。读完之后,你应该能够看着一个数据集,在几秒内判断出哪种格式更合适,以及在两种格式都需要时如何在它们之间转换。

JSON vs CSV 速览

简而言之:JSON 是为程序和 API 而生的嵌套式自描述格式,而 CSV 是为电子表格和简单行列数据而生的扁平表格格式。JSON 自带结构和数据类型;CSV 只是由逗号分隔的纯文本。以下是两者在通常决定取舍的各个维度上的对比。

维度 JSON CSV
结构 嵌套且分层(对象和数组) 扁平且表格化(行和列)
可读性 通过键值对自描述;缩进后一目了然 紧凑,但随着数据增长以及值中包含逗号时,可读性下降
嵌套 原生支持对象中嵌套对象和数组 不支持;嵌套数据必须展平或编码为字符串
数据类型 字符串、数字、布尔值、null、数组、对象 纯文本和数字;其他一切都是字符串
文件大小 较大;每个键都重复出现,并添加大括号和方括号 较小;除分隔符外无其他结构字符
工具支持 API、编程语言、Web 和移动应用 Excel、Google Sheets、数据库、pandas
典型用途 API 响应、动态和分层数据 数据导出、分析、扁平数据交换

两者之间几乎所有其他差异都源于第一行。JSON 支持嵌套,CSV 不支持,其余差异(大小、类型支持、哪些工具能打开它)都由这一个结构性事实衍生而来。

什么是 JSON?

JSON(JavaScript Object Notation)是一种轻量级数据交换格式,已成为现代 Web 开发的基石。它起初是 JavaScript 的一个子集,但现在已与语言无关,几乎所有编程语言都提供支持,这也是它成为服务间通信默认格式的原因。

JSON 以键值对的形式表示数据,且这些键值对可以嵌套。一个值可以是字符串、数字、布尔值、null、数组或另一个对象,因此 JSON 可以在一个文档中描述复杂的分层记录。以下是一个简单示例:

json
{
  "name": "John Doe",
  "age": 30,
  "skills": ["JavaScript", "Python", "SQL"],
  "address": {
    "city": "New York",
    "zip": "10001"
  }
}

注意 skills 持有一个数组,address 持有另一个对象。在一个自描述文档中表示对象、数组和嵌套关系的这种能力,正是 JSON 成为 API 和 Web 应用默认格式的原因。常见的使用场景:

  • API。JSON 是 API 数据交换最常见的格式,实现了客户端和服务器之间的清晰通信。
  • Web 开发。前端和后端系统依赖 JSON 动态传输结构化数据。
  • 系统间数据传输。其紧凑且易于解析的形式简化了移动应用、数据库和 Web 服务之间的数据交换。

什么是 CSV?

CSV(Comma-Separated Values,逗号分隔值)是存储结构化数据最简单、使用最广泛的格式之一。其简洁的设计使其成为以行列方式组织数据的标准,非常类似于电子表格中的表格。

CSV 文件以扁平的表格结构表示数据:每行是一条记录,每列是一个字段,值之间以逗号(有时也用制表符或分号)分隔。以下是一个基本示例:

csv
Name,Age,Skills,City
John Doe,30,JavaScript;Python;SQL,New York
Jane Smith,25,HTML;CSS,Los Angeles

与 JSON 不同,CSV 不是按层次组织的,实际上只能存储纯文本和简单数字。注意上面的 Skills 列:一个列表不得不用分号分隔符塞进一个单元格,因为 CSV 没有原生表达列表的方式。这种简单性也是它的优势,使 CSV 易于生成、解析和共享。常见的使用场景:

  • 电子表格。Microsoft Excel 和 Google Sheets 等工具默认导入和导出 CSV。
  • 数据库。CSV 是在数据库之间传输数据或填充新表的常见方式。
  • 轻量级数据共享。由于文件紧凑且易于编辑,CSV 非常适合在团队和平台之间传递数据。

JSON 与 CSV 的主要差异

上表是快速参考。在几个主要维度上做进一步探讨是值得的,因为每一个都指向你实际会面临的决策。

结构:分层 vs 扁平

JSON 支持嵌套结构,因此可以直接表达层次关系:对象中的数组、对象中的对象,深度随数据需要而定。CSV 严格扁平且表格化,无法表达嵌套或关系,因此任何层次化的内容都必须展平为额外的列,或在单个单元格中编码为字符串。这是驱动所有其他差异的根本区别。

可读性:自描述 vs 紧凑

JSON 在缩进后可读性强且直观,因为每个值都紧跟着命名它的键,一眼就能理解一条记录的结构。CSV 更为紧凑,但它依赖列位置而非标签,因此大文件难以阅读,而包含逗号的值需要加引号或转义才能保持可解析性。

文件大小:冗余 vs 效率

JSON 通常更大,因为它在每条记录上重复所有键,并添加大括号、方括号和引号来表达结构。这些开销在数千行记录中会累积成可观的量。CSV 则很轻量:表头只写一次,之后只携带值和分隔符,因此对于大型扁平数据集,它在磁盘上明显更小,传输也更快。

数据类型:丰富 vs 纯文本

JSON 区分字符串、数字、布尔值、null、数组和对象,解析器能够忠实地还原这些类型。CSV 将所有内容存储为文本,读取时必须推断 30 是数字还是 true 是布尔值,复杂的值必须展平或编码为字符串,这使得反向解析时更加复杂。

工具支持与典型用途

JSON 是 API、Web 和移动应用以及任何具有分层或动态数据场景的语言;在程序是消费方的任何地方它都如鱼得水。CSV 是电子表格和分析的语言:将其导入 Excel、Google Sheets 或 pandas,几秒钟即可开始工作。你选择的格式通常只是下一步打开文件的工具所决定的。

Crawlbase Crawling API

当你要采集数据而不仅仅是存储数据时,格式问题出现在输出阶段。Crawlbase Crawling APICrawling API 为你处理渲染、IP 轮换和反爬,然后返回干净的结果,你可以将其保存为 JSON 供下游代码使用,或展平为 CSV 供电子表格使用,从而选择最适合下一步的格式,而不是折腾原始 HTML。

何时使用 JSON

当你的数据是结构化的、分层的,或目标消费方是程序而非人时,JSON 是正确的选择。最典型的场景:

  • API 集成。JSON 是 API 的标准格式,正是因为它能表达复杂的嵌套数据。返回用户及其订单列表的 REST 端点是天然的适配场景:订单嵌套在用户内部,无需展平。
  • 动态应用。动态更新数据的 Web 和移动应用依赖 JSON,这也得益于它与 JavaScript 对象的无缝映射。携带元数据(时间戳、已读状态)发送每条消息的聊天应用是典型示例。
  • 分层数据。任何记录存在父子关系或一对多关系时,JSON 都能无障碍地存储和检索它们。

如果你的数据有任何深度,或者另一段软件是消费方,默认使用 JSON。关于在代码中使用它的更多内容,请参阅我们的 Python 数据解析指南以及 Python 网站抓取中的完整工作流。

何时使用 CSV

当数据是扁平的、消费方是电子表格或分析师、且大小或简洁性比结构更重要时,CSV 是赢家。最典型的场景:

  • 数据分析。CSV 可以直接加载到 Excel、Google Sheets 或 pandas,非常适合快速探索销售记录、客户人口数据或调查结果。
  • 电子表格导出。当数据需要在电子表格软件中打开或共享时,CSV 是通用的导入导出格式。导出数据库表以供离线查阅是典型用例。
  • 简单数据交换。当记录没有嵌套且只有基本类型时,CSV 可以高效传输它们。在两个营销工具之间传递一份邮件订阅者列表就是一个好例子。

如果数据自然地适合表格,且下一步是人类或电子表格,CSV 更小、更简单,完全够用。一旦你发现自己需要将列表编码到单个单元格中,这就是你已经超出 CSV 适用范围、应该改用 JSON 的信号。

快速规则

数据是否有嵌套,或者会被程序消费?使用 JSON。数据是否扁平,且会被电子表格或分析师打开?使用 CSV。大多数实际决策都归结为这两个问题。

如何在 JSON 和 CSV 之间转换

你很少会永远只用一种格式。API 返回 JSON,但利益相关方想要电子表格;CSV 导出需要变成 API 载荷。两者之间的转换是一项常规任务,有几种工具可以处理:

  • Python 库。pandasjsoncsv 库可以用几行代码完成大多数转换。
  • 在线转换工具。JSON2CSV 等网站可以快速处理较小的数据集,无需编写代码。
  • 电子表格软件。Excel 和 Google Sheets 可以导入 JSON(通过插件或脚本)并导出为 CSV。
  • 自定义脚本。用 Python 或 JavaScript 自己编写,可以完全控制嵌套字段如何展平或重建。

需要注意的是嵌套问题。从 JSON 转换为 CSV 意味着展平:嵌套对象变成带点号的列名,数组被合并或拆分到多行,因此深度嵌套的数据可能无法干净地映射到扁平表格。反向转换是无损的,因为扁平行总能放入 JSON 中。以下是使用 pandas 的双向转换示例:

python
import pandas as pd

json_data = [
    {"name": "John Doe", "age": 30},
    {"name": "Jane Smith", "age": 25},
]

# JSON to CSV: flatten, then write the table
df = pd.json_normalize(json_data)
df.to_csv("output.csv", index=False)

# CSV to JSON: read the table, dump records
df = pd.read_csv("output.csv")
df.to_json("output.json", orient="records", indent=4)

json_normalize 是从 JSON 转换为 CSV 的关键:它将嵌套键展平为列,使分层记录能够适配扁平表格。对于包含数组或深度嵌套的数据,你可能需要逐字段决定是展平它、合并到一个单元格,还是拆分成多行。

回顾

核心要点

  • 结构是全部差异所在。JSON 支持嵌套;CSV 是扁平的。所有其他取舍都由这一个事实衍生而来。
  • JSON 用于程序和嵌套数据。API、Web 和移动应用,以及任何具有层次结构或丰富数据类型的记录。
  • CSV 用于电子表格和扁平数据。分析、数据导出,以及大小和简洁性优先的简单数据交换。
  • 大小和类型的取舍是真实存在的。JSON 重复键并保留类型;CSV 更小,但将一切视为文本。
  • 转换是常规操作,但要注意嵌套。将 JSON 展平为 CSV 可能丢失结构;CSV 转 JSON 是无损的。pandas 等工具可以用几行代码完成双向转换。

常见问题

JSON 和 CSV 哪个更好?

没有哪个在总体上更好,它们适合不同的工作。JSON 更适合嵌套数据和程序间交换(如 API)。CSV 更适合扁平、表格化数据,用于电子表格或分析工具。根据数据的结构以及接下来要打开它的工具来选择格式。

为什么 JSON 比 CSV 大?

JSON 在每条记录上重复所有键,并添加大括号、方括号和引号来表达结构。CSV 在表头中只写一次列名,之后只携带值和分隔符。对于大型扁平数据集,这些开销使 JSON 在磁盘上明显大于等效的 CSV。

CSV 能存储嵌套数据吗?

不能原生支持。CSV 严格扁平,因此嵌套对象和数组必须展平为额外的列,或编码为单个单元格中的字符串(例如,用分号连接的列表)。如果你的数据有真正的层次结构,JSON 能更干净地表达它。

如何在 Python 中将 JSON 转换为 CSV?

最简单的方法是使用 pandas:加载 JSON,调用 pd.json_normalize() 将嵌套键展平为列,然后用 df.to_csv() 写出结果。对于复杂的嵌套,你可能需要在展平前决定每个嵌套字段应如何映射到列。

哪种格式解析更快?

对于简单的扁平数据,CSV 通常解析更快、更轻量,因为几乎没有结构需要解释。JSON 解析做更多工作,因为它需要重建嵌套对象和类型化值,但当数据是分层的时,这些工作正是你所需要的。速度本身很少能决定选择,数据结构才是关键。

Crawlbase 以 JSON 还是 CSV 格式返回数据?

两者都支持。Crawlbase Crawling API 和 Scraper API 返回已解析的结果,你可以将其保存为 JSON 供下游代码使用,或展平为 CSV 供电子表格和分析使用,从而选择最适合管道下一阶段的格式。

开始构建

大规模爬取任何站点,无需与基础设施对抗。

Crawlbase 负责处理代理、指纹和 CAPTCHA,让你的团队专注于交付数据流水线,而非维护爬取管道。1,000 次请求免费,无需信用卡。

自助开通 · 无需销售通话 · 提供企业级爬取量