简体中文

开发者工具 · JSON 格式化程序和验证程序

有效 JSON 与针对模式有效:“有效”的两种含义

· 背景

json 标准 验证

有效 JSON 与针对模式有效:“有效”的两种含义用 JSON 标记和精确的验证边界来说明
原始 ToolAcre 矢量图

验证器说您的 JSON 有效仅意味着它可以解析。这篇文章解释了有效性的级别(语法、结构、语义)以及为什么 JSON 模式对于语法之外的所有内容都存在。

有效,但仍被拒绝

请求可能是无可挑剔的 JSON 但仍然无法被 API 接受。 `{"username":"nori","plan":"gold"}` 具有平衡的分隔符、带引号的名称和合法值,但服务可能需要电子邮件、拒绝计划名称或禁止在当前状态下创建帐户。解析器和应用程序正在回答不同的问题,因此两个结果都可能是正确的。

ToolAcre 仅回答第一个问题:该文本能否在其输入限制内被解析为严格的 JSON ?它不会加载架构、检查所需属性、验证格式、联系数据库或评估业务规则。当该工具显示“有效”时,请将其解读为“格式正确的 JSON 语法”,而不是将其视为来自将使用该值的系统的批准。

第一级:格式良好的语法

语法验证检查 JSON 语法:一个顶级值、正确配对的容器、带引号的对象名称、有效的逗号和冒号、合法字符串、合法数字和精确文字。它拒绝 `NaN` 和 `Infinity`、注释、尾随逗号和单引号字符串。它接受任何语法有效的形状,包括单独的数字或具有不熟悉字段的对象。

格式错误的源有一个文本故障点,因此 ToolAcre 可以报告第一个不可能字符的行和列。缺少逗号可能会导致报告下一个引用;尾随逗号可能会导致报告结束分隔符。修复语法创建一个可解析的值,但不能确定该值具有另一个程序所期望的形状或含义。

第二级:形状

形状验证询问解析的值是否与声明的合约匹配。用户架构可能需要 `email`,将 `age` 限制为至少 18 的整数,将 `tier` 限制为 `free` 或 `pro`,并禁止未知属性。 `{"email":false,"tier":"gold"}` 是有效的 JSON 语法,但不符合这些结构规则,因为值类型和允许的选择是错误的。

JSON Schema 是表达此类约束的一种方法,但 ToolAcre 不执行它。模式验证器通常报告实例路径(例如 `/tier`)、关键字(例如 `enum`)以及解释性消息而不是解析器插入符号。诊断此级别时,将架构版本和 API 合约保留在有效负载旁边;更改标点符号不会修复错误形状的正确解析值。

第三级:含义

含义取决于超出文档静态形状的事实和规则。 `accountId` 可以在不命名帐户的情况下具有正确的字符串模式。开始日期可以匹配 ISO 样式格式,但晚于结束日期。数量可以为正但超过当前库存。这些故障需要应用程序上下文、存储状态或字段之间的关系。

一些语义约束可以在模式中近似,但许多属于可以使用权威数据和事务状态的服务逻辑。此级别的错误响应应识别相关字段或规则,而不会假装 JSON 文本格式错误。 ToolAcre 无法重现这些决策,因为它既不知道合同,也不将输入发送到拥有业务规则的应用程序。

工作示例:通过三项检查的一个有效负载

以 `{"sku":"A-19","quantity":3,"warehouse":"north"}` 开头。 ToolAcre 接受它:所有名称和值都遵循 JSON 语法。然后,模式可以需要一个对象、一个非空字符串 SKU、一个正整数数量和一个记录的仓库代码。假设该有效负载也通过了这些约束。两项检查均未确认 SKU A-19 存在或 North 拥有三个单位。

库存服务根据当前记录执行第三次检查,并可能因不可用而拒绝请求。改变缩进不能改变结果。如果 `quantity` 写成 `03`,语法首先会失败;如果是 `"3"`,解析将通过,但模式类型检查将失败;使用数字 `3` 时,仅保留活畜规则。因此,由于三个不同的原因,同一字段可能在三个不同的层上失败。

每张支票所属的地方

在编辑时尽早运行语法验证,因为稍后的检查无法对未解析的文本进行可靠的操作。在每个不受信任的应用程序边界强制执行声明的形状,而不是假设客户端已经这样做了。评估拥有所需状态的组件中的业务不变量,尤其是当答案可能在请求之间发生变化时。

客户端检查可改善反馈,但不会取代服务器端强制执行。相反,服务器响应“invalid JSON”应该保留用于解析失败,而不是用于每个被拒绝的请求。清晰的分离产生有用的诊断:用于语法的行和列、用于结构约束的实例路径以及用于语义冲突的特定于域的代码或消息。 ToolAcre 仅提供第一类。

这不包括什么

此格式化程序不会创作或评估 JSON 架构、选择架构草稿、解析架构引用、插入默认值或将字符串强制转换为数字。它也不知道 API 的 OpenAPI 文档或自定义验证约定。在输入旁边提供模式不会改变 ToolAcre 的结果,因为该工具中没有模式处理步骤。

语法验证也不会在此处检测重复的对象名称; `JSON.parse` 保留格式化前最后一次出现的情况。它也不保证数字精度、规范字节、安全渲染或授权。每个问题都需要自己的合同和实施。避免将它们压缩成一个绿色的“有效”徽章,因为这样做会隐藏收集了哪些证据以及从未提出过哪些问题。

要点:“有效”需要限定符

验证每项验证声明。 “有效JSON”表示文本遵循语法。 “针对此模式有效”意味着解析的值满足命名的结构契约。 “服务接受”是指当前应用规则允许操作。在许多工作流程中,通过一个层对于下一个层是必要的,但并不能证明所有后续层都已通过。

使用 ToolAcre 格式化和检查严格语法,包括拒绝非 JSON 文字,例如 `NaN` 和 `Infinity`。然后使用实际管理有效负载的模式和应用程序。当请求仍然失败时,请在其自身层读取错误,而不是重复重新格式化正确的 JSON。该工具没有模式检查,并且明确的边界比过于宽泛的有效性承诺更有用。