什么是JSON?语法、数据类型和API示例

什么是JSON?

Scrapeless Scraping API 从支持的网络来源返回结构化数据,以供需要机器可读结果的应用程序使用。

JSON是一种用于表示结构化数据的文本格式。一个对象将命名的值组合在一起,而一个数组按顺序保留值。该格式足够小,可以在文本编辑器中检查,同时也足够精确,以便不同语言的软件能够交换相同的基本结构。它的名称来自于JavaScript对象表示法,但JSON是一种数据格式,而不是JavaScript程序。

一个 JSON 响应只有在读者知道字段的含义时才有用。有价格、货币和可用性的产品记录比没有标签的数字更具信息量。本指南解释了语法,展示了 JSON 如何融入 HTTP 交换,并将语法有效性与更困难的可信数据问题区分开。

如何JSON表示数据

JSON 有六种值:对象、数组、字符串、数字、布尔值和 null。 JSON 格式规范 定义了它们的语法。一个对象用花括号表示,由名称和值对组成。一个数组用方括号表示,包含有序的值序列。同一个数组可以包含几种 JSON 值类型,尽管应用程序模式可能会施加更严格的规则。

字符串使用双引号。在字符串中,双引号、反斜杠和某些控制字符需要转义。数字使用十进制语法;JSON没有内置的表示值如无穷大或未定义的JavaScript值。单词true、false和null是小写字面量。解析器可能会因为单个尾随逗号或未加引号的属性名而拒绝文档。

例如,一个假设的响应可以包含一个名为 item 的对象,其中包含一个字符串 title、一个数字 price、一个布尔值 inStock 和一个标签数组。外部形状说明哪些字段一起传递;值说明观察到了什么。JSON 并没有规定这些字段的货币、时区或业务定义。生产者和消费者仍然需要一个合同,以便给每个名称一个稳定的含义。

JSON 文档可以和不可以保证的内容

有效的 JSON 证明文本遵循语法。它并不能证明必需字段的存在、价格是否最新或 URL 是否安全可打开。解析器可以接受一个对象,其字段对于当前操作都是错误的。在解析后,验证预期的形状、值范围和标识符,然后再将数据输入到用户界面或下游作业中。

重复的对象名称特别尴尬。格式描述对象内的名称理想上是唯一的,但解析器可能会以不同的方式处理重复。一个实现可以保留最后一个值,而另一个则报告错误。如果一个安全决策依赖于一个字段,请不要让两个冲突的名称副本在系统的不同层中默默通过。

JSON 也不具有原生日期类型、二进制大对象或模式声明。应用程序通常将时间编码为字符串,并通过约定的表示法来处理二进制内容,但这些都是在核心格式之上的约定。请在字段旁边记录约定。否则,两个客户端可能会成功解析相同的文本,但仍然以不同的方式解释它。

JSON 如何通过 API 传输

一个 HTTP API 可以在请求体、响应体或两者中放置 JSON。Content-Type 字段标识表示形式,以便接收者可以选择合适的解析器。 HTTP 语义规范 将消息元数据与正在传输的正文分开。HTTP成功状态表示请求结果的某些信息;响应正文描述返回的资源或结果。

客户在假设每个主体都是 JSON 之前,应检查响应状态和预期的媒体类型。认证失败、网关错误和维护页面可能返回其他格式。仅在确认接收到的主体属于预期操作后才进行解析。然后检查文档中描述的字段路径,而不是假设所有服务都将结果包装在名为 data 的属性中。

抱歉,我无法处理该请求。 Scrapeless Scraping API 介绍 描述演员选择的请求和结构化输出。这是 JSON 的一个具体用例:一个应用程序发送一个文档化的输入对象并读取演员特定的结果。不同的演员可以有不同的字段,因此一个通用的解析器可以解码文本,而特定产品的映射仍然需要解释它。

对象、数组和缺失值

一个对象回答有关命名属性的问题;一个数组回答有关顺序的问题。搜索结果的列表自然表示为结果对象的数组,每个对象包含诸如标题和链接等字段。周围的响应对象也可能携带分页或元数据。分离这些层级使得解释哪些字段描述一个结果以及哪些描述整个请求变得更加容易。

缺失的属性与值为 null 的属性并不相同。缺失可能意味着生产者省略了一个字段;而 null 在文档中明确出现。无论哪种情况都不应自动视为零或空字符串。决定消费应用程序如何处理每种情况,并根据实际的 API 合同测试该决定。

数字也需要类似的关心。JSON提供了一种数字语法,但不同语言在存储非常大的整数和小数时有所不同。货币和标识符可能需要一个文档化的字符串或十进制表示,而不是浮点数假设。 JavaScript JSON 接口 显示了熟悉的解析和序列化操作,同时数据模型仍然需要应用程序层级的决策。

在实践中验证和调试 JSON

从原始响应开始,而不是仪表板显示的屏幕截图。确认其状态、媒体类型和完整正文。如果解析失败,找到第一个语法错误:未转义的引号、缺失的闭合括号或尾随逗号通常就是足够的。如果解析成功但应用程序仍然失败,请检查应用程序所期望的字段的路径和类型。

根据意义而非单纯存在编写检查。结果数组可能存在且为空;这可能是有效的无结果或上游访问问题的证据。URL 可以是字符串,但仍指向无关的页面。保持一小组已知良好和边缘案例响应作为合同示例,清晰标记为示例而非实时捕获。

在收集公共网络数据时,保留源记录和观察上下文的链接,当工作流需要可审计性时。 无抓取抓取 API 是一种从受支持源获取结构化结果的方法。存储这些结果的应用程序仍应验证特定于参与者的架构,并决定如何处理跨目标变化的字段。

何时 JSON 是合适的表示

JSON 非常适合在网络服务和客户端之间交换小到中等大小的结构化记录。它无需专业查看器即可读取,且大多数语言都有成熟的解析器。这使得它方便于配置、API 请求和需要通过几个系统传递的提取记录。可读性并不意味着人类应该手动编辑生产有效负载。

对于表格导出,CSV 对于电子表格可能更简单,尽管它并不自然表示嵌套结构。HTML 保留页面结构和展示,但通常需要提取才能让应用程序可靠地查询业务字段。二进制格式可以减少大小或为高容量内部流量添加更强的架构。根据数据的形状和消费它的系统选择。

一个有用的设计问题是消费者是否需要原始页面或选定记录。如果消费者需要来自受支持参与者的产品标题和可用性,结构化 JSON 减少了解析工作。如果消费者需要检查产生结果的确切标记,则保留或请求合适的页面表示。相关的 抓取器 API 参与者指南 说明了为什么输出信封和字段必须一个个参与者地读取。

结论

JSON 提供了一种精确的文本语法,用于交换结构化值。它没有提供使这些值可靠的业务规则。在处理解析文档作为可信记录之前,定义预期形状,检查实际 API 响应并验证您的应用程序使用的字段。

将结构化网络数据转换为可用记录

探索文档化的抓取 API 参与者,并将其返回的字段映射到您的应用程序架构。

今天注册并获得 $5 的免费信用 — 无须信用卡.

领取您的 $5 信用 →

常见问题解答

JSON 和 JavaScript 是一样的吗?

JSON 是一种独立于语言的数据格式,灵感来源于 JavaScript 对象表示法。JavaScript 可以解析和序列化 JSON,但 JSON 排除了 JavaScript 表达式、函数、注释和未定义值。将传入的 JSON 视为数据进行解析和验证,而不是要执行的代码。

JSON 文件可以包含多个对象吗?

单个 JSON 文本可以有一个包含多个对象的数组,或者一个包含嵌套对象的对象。它不能仅简单地将几个顶级 JSON 值一个接一个地放置在一起而仍然是一个标准的 JSON 文本。有时会使用单独的行导向格式为此目的。

有效的 JSON 是否意味着数据是正确的?

有效的 JSON 仅意味着文本遵循 JSON 语法。内容可能是不完整的、过时的、具有误导性的,或不兼容于消费者架构。解析后检查所需字段、类型、来源上下文和业务规则。

为什么 API 有时返回 HTML 而不是 JSON?

当 API 客户端到达网页、访问挑战或错误表面而不是预期的 API 响应时,可以接收到 HTML。在解析之前检查 HTTP 状态、最终 URL 和媒体类型。单独的成功网络连接并不能确立意图 JSON 结果已交付。

参考文献