CSV vs JSON
Scrapeless Google Search API 以 JSON 返回结构化搜索数据,用于下游处理和分析。
摘要
- CSV 表示一个由文本字段组成的表格。 列类型和缺失值约定需要事先明确约定。
- JSON 表示对象、数组和标量值。 它可以在不将关系扁平化为重复行的情况下保留嵌套关系。
- 转换可能改变一条记录的含义。 在导出前定义行粒度以及数组的处理方式。
- 格式选择从消费者开始。 电子表格审阅与服务到服务的响应往往需要不同的表示形式。
CSV vs JSON 主要是关于数据形状和接收系统的问题。CSV 适合稳定的矩形表格,便于人或工具以行和列进行查看。JSON 适合结构中包含嵌套对象、列表和可选字段的记录。
两种扩展名都不能自动使数据集变得准确。CSV 可以被良好地规范并进行强校验;JSON 响应也可能不一致且含糊不清。在定义标识符、类型和缺失值行为之后再选择表示形式。这样的约定才是让文件在离开生成它的系统后仍然有用的关键。
这些格式实际在表示什么
CSV 将字段组织成记录,通常带有一个命名列的表头。该 CSV 格式说明 记录了对逗号、换行和嵌入双引号的引用规则。CSV 仍然是一组实用方言的家族,因此生产者应声明分隔符、编码和表头约定。
JSON 用定义好的语法表示值,包括对象、数组、字符串、数字、布尔值和 null。该 JSON 交换规范 定义了这些类型,但不会为你的业务字段指定模式。语法上有效的对象仍然可能遗漏必需的标识符,或在应用期望数字的地方放入字符串。
设想一个有多个优惠的产品。JSON 可以在产品内保留一个 offers 数组。CSV 则需要做出决定:在每个优惠行中重复产品、创建另一张相关表,或在字段内编码列表。每一种选择都会改变消费者必须如何解读输出。
| 维度 | CSV | JSON |
|---|---|---|
| 自然形状 | 矩形记录 | 对象、数组和标量 |
| 类型 | 外部模式提供类型 | 语法自带类型;业务模式仍然必需 |
| 嵌套数据 | 展平或创建关联表 | 保留对象和数组 |
| 缺失值 | 定义一种约定 | 区分缺失键与 null |
| 常见消费者 | 电子表格和表格导入 | API 和结构化应用 |
模式让文本字段可被解释
模式提供了文件名无法表达的含义。CSV 字段需要声明类型、单位、必需值和键。该 W3C 表格数据模型 描述了带有元数据(包括列和关系)的表。这使得限制变得具体:CSV 语法和表格语义是两个独立层次。
对于搜索导出,把结果 URL 视为文本,把位置视为定义好结果类别中的整数,把抓取时间视为带有约定时区的值。当前导零很重要时,将标识符存储为字符串。电子表格的自动类型检测不应定义源端契约。
JSON 同样需要明确的约束。决定缺失键与值为 null 的键是否意味着同一件事。指定空数组是表示没有相关记录,还是表示关系不可用。验证应在字段类型发生变化且尚未悄然进入仪表盘之前将其拒绝。
展平嵌套结果需要行粒度
CSV 导出需要对每一行代表什么给出一个明确答案。如果一个搜索响应包含自然结果、相关问题和其他模块,这些集合可能描述的是不同实体。将它们展平为一个带有共享位置列的单一表格,会造成具有误导性的比较。
选择一个粒度,例如每个查询、市场和抓取对应一个有机结果。将查询和上下文存储在每一行导出数据中,或通过稳定的抓取标识符进行关联。当其他结果集合的字段和排序具有不同含义时,将它们保存在单独的表中。这样可以在不臆造不同模块之间等价关系的情况下保留它们之间的关联。
如果将数组展开为多行,请记录乘法过程。一个具有多个优惠的产品会生成多条优惠记录,而不会变成多个不同的产品。比较产品数量时使用产品键,比较优惠数量时使用优惠键。否则,一个看似无害的导出转换可能会抬高业务总量并扭曲覆盖率报告。
缺失值、数字和文本需要明确的规则
缺失是导致转换错误的最常见来源之一。CSV 没有定义通用的类型化空值,因此空字段的含义取决于你的约定:它可能表示空字符串,也可能表示缺失值。请预留一种清晰的表示方式,并确认接收端的解析器会按该方式处理。
JSON 有 null,但 null 并不能解释为什么某个值不可用。当原因会影响理解时,请使用一个额外的状态字段。一个不存在的价格与一个无法解析的价格是不同的。当你需要调查这些情况时,请保留原始值或经过编辑的诊断信息。
数值精度同样会跨越系统边界。以 JSON 数字形式表示的长标识符,可能会被数值精度受限的使用方错误解析。当算术运算没有意义时,应将标识符表示为字符串。对于货币数值,应显式定义货币种类和小数处理方式,而不是依赖读取方默认的浮点数转换。
流式传输和文件大小取决于表示形式
CSV 可以按记录逐条处理,但带引号的字段中可能包含换行符。因此,仅逐行读取物理行并不是完整的 CSV 解析方式。请使用能够理解声明方言(dialect)、并能区分记录边界与字段内换行符的解析器。
大型 JSON 数组也可以使用合适的解析器进行增量消费。换行分隔的 JSON 是处理独立记录的另一种有用约定,但应当被明确描述,而不是与单一的普通 JSON 文档混为一谈。生产者和消费者必须就“分帧”方式达成一致,双方才能安全地进行流式传输。
避免使用放之四海而皆准的大小结论。JSON 会重复字段名,而 CSV 通常只写一次,但嵌套结构、被省略的字段、引号处理以及压缩方式都会影响结果。请在相同的记录集、编码和压缩设置下比较具有代表性的导出文件。体积最小的文件并不总是最容易验证或集成的。
将源响应和分析导出分开保留
可靠的搜索工作流程可以保留结构化的原始响应,并生成用于分析的专用表格。 无抓取的 Google 搜索 API 提供结构化的 JSON;你的转换定义了哪些字段成为 CSV 列,哪些上下文随之携带。CSV 文件是一个分析视图,而不是对每个源字段的替代。
这个 搜索结果 CSV 分析工作流 说明了为什么查询上下文和结果类别属于导出规划的一部分。保留捕获标识、源上下文和映射规则,以便分析人员可以将一行数据追溯到其采集事件。
使用当前 无爬取方案定价 用于获取规划,并将转换和存储成本与生成数据的请求分开计量。
通过契约和使用方选择格式
当接收系统期望一个规则的表格、列是稳定的并且人们需要直接用电子表格查看时,选择 CSV。当前端服务需要嵌套关系、可选集合或带类型的标量值的结构化响应时,选择 JSON。当其中一种格式是源记录而另一种是有意的投影时,两种格式一起使用。
在交付之前,使用预期的消费者解析输出。检查在正确粒度下的记录计数、标识符保留、非 ASCII 文本、引号、换行符和缺失值。在验收数据集中包含一个嵌套或多值示例,以防转换过程仅通过处理简单行就被认为是成功。
当含义发生变化时,要为架构进行版本化。对于某些导入器来说,添加一列可能是兼容的,而对另一些导入器来说则具有破坏性。更改现有列的含义可能比更改其名称更糟糕。在接收文件的边界处记录映射并对其进行验证。
结论
CSV 与 JSON 的选择应根据记录的结构和使用方的需求来决定。先定义类型和键,再在扁平化之前选择行级粒度,并在接收系统中测试导出的文件。当你需要嵌套细节时保留源 JSON,并创建包含准确分析所需上下文的 CSV 视图。
准备好将搜索结果转化为分析了吗?
使用 Google 搜索 API 收集结构化搜索数据,然后为你的电子表格或应用程序构建一个已验证的导出结果。
今天注册即可获得 5 美元的免费额度 — 无需信用卡.
领取你的 $5 额度 →常见问题解答
JSON 比 CSV 更好吗?
JSON 更适合嵌套记录,而 CSV 通常更适用于扁平表格和电子表格导入。两种格式都不是普遍更好的选择。正确的选择取决于数据结构、验证规则以及接收系统。
CSV 会保留数据类型吗?
CSV 在其普通字段语法中并不携带通用的已类型化模式。使用方可以推断类型,但这种推断可能会改变标识符、日期和空值。当这些差异很重要时,请提供列定义并显式配置读取器。
是否可以在不丢失信息的情况下将每个 JSON 响应转换为 CSV?
JSON 响应并不总是可以在不做转换决策的情况下表示为一个 CSV 表。嵌套对象和数组需要扁平化、拆成关联表,或采用嵌入式表示。记录清楚保留了哪些信息,以及每一行结果所代表的含义。
换行分隔 JSON 是一个 JSON 数组吗?
换行分隔 JSON 是一系列分别封装的 JSON 记录,而不是一个 JSON 数组文档。请使用为这种约定设计的读取器,并记录帧边界的约定。重命名文件并不会改变记录的分隔方式。