如何第一时间看到新文章?
收藏本博客列表页,并在首页与工具聚合页留意指南入口。阅读文章无需注册或邮件订阅。
从语法、质量规则和数据契约三个层次解释 JSON Validator、JSON Linter 与 JSON Schema 的区别,并用同一份 API 数据演示它们应该如何组合使用。
开发中经常出现一种困惑:一段 JSON 已经能够被解析,为什么接口仍然拒绝它?或者 JSON Validator 显示有效,JSON Linter 却继续报告问题?
原因是这三类工具解决的不是同一个问题。JSON Validator 检查文本是否合法,JSON Linter 检查质量与约定,JSON Schema 描述数据必须满足的结构和规则。它们不是互相替代,而是位于同一条质量流水线的不同阶段。
如果只想快速选择,可以先看这张表。
| 工具 | 核心问题 | 常见输入 | 典型结果 |
|---|---|---|---|
| JSON Validator | 这段文本是不是合法 JSON? | JSON 文本 | 通过,或给出语法错误位置 |
| JSON Linter | 这段 JSON 是否符合质量、风格或团队规则? | 已解析的 JSON | 警告、建议或规则违规 |
| JSON Schema | 业务允许的数据应该长什么样? | Schema 文档 | 一套可供验证器执行的数据契约 |
> 最实用的顺序:先验证语法,再执行 Lint,最后使用 JSON Schema 验证业务结构。
“JSON Validator”在不同产品中可能指两种工具:
JSON.parse 或等价解析器为基础。Json Work 当前的 JSON Validator 属于第一类,主要检查语法并定位解析错误。JSON Schema 官方文档所说的 Validator 通常属于第二类:它以 Schema 和 Instance 为输入,输出验证结果。
写文档、选工具或讨论接口时,最好明确说“syntax validator”还是“schema validator”,否则双方可能使用同一个词表达完全不同的验证层次。
JSON 是一种具有明确语法的数据交换格式。RFC 8259规定了对象、数组、字符串、数字、布尔值和 null 等合法形式。语法验证器关心的是字符和结构是否满足这些规则。
下面的内容不是合法 JSON,因为 id 与 name 之间缺少逗号:
{
"id": 101
"name": "Alice"
}语法验证器通常能够发现:
undefined、NaN、Infinity 等 JSON 不支持的值修复逗号后,下面的数据在语法上完全有效:
{
"id": "one hundred",
"email": "not-an-email",
"active": "yes"
}但“能够解析”不代表它符合你的接口。语法验证器不知道 id 是否应该是整数,也不知道 active 是否必须是布尔值。它只回答:这是不是合法 JSON 文本?
如果语法失败,可以先用 JSON Validator 定位错误;如果内容只是接近 JSON,再考虑 JSON Repair,并人工核对修复结果。
Lint 是基于规则的静态分析。与 JSON 语法不同,Lint 规则通常不是统一标准,而是工具或团队根据可维护性、风格和风险制定的约定。
例如:
{
"user_id": 101,
"userName": "Alice",
"isActive": "true"
}这段 JSON 语法有效,但 Linter 可能提示:
user_id 与 userName 使用了不同命名风格isActive 看起来像布尔字段,却使用了字符串这些提示不一定代表数据错误。"true" 也可能是上游系统明确要求的字符串,snake_case 和 camelCase 也没有绝对的优劣。Linter 的价值是让隐含约定变得可见,并帮助团队保持一致。
因此,JSON Linter更适合回答:
它不能替代业务契约。没有 Schema 时,Linter只能根据启发式规则猜测 isActive 是否应该是布尔值。
JSON Schema 是一种用于描述和约束 JSON 文档的标准化词汇。它可以表达数据类型、必填字段、嵌套对象、数组元素、数值范围、字符串长度、枚举和组合条件。JSON Schema 官方介绍将其用途概括为验证、数据交换和文档化。
下面是一份用户数据 Schema:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string",
"minLength": 1
},
"email": {
"type": "string",
"format": "email"
},
"active": {
"type": "boolean"
}
},
"required": ["id", "name", "email"],
"additionalProperties": false
}这份 Schema 明确表达:
id 必须是整数name 必须是非空字符串email 是字符串,并标注为 email 格式active 如果存在,必须是布尔值id、name、email 必须存在需要注意,JSON Schema 是规则文档,不是执行程序。你仍然需要 AJV、Python jsonschema 等 Schema Validator,把 Schema 应用到实际 JSON Instance 上。JSON Schema 官方入门也把这两个输入区分为 Schema 与 Instance。
还要注意实现差异。例如 format 在 JSON Schema 中默认可能只是注解,是否作为强制断言取决于验证器和配置。JSON Schema 的 format 说明明确提醒了这一点。生产环境应确认所用验证器、Draft 版本和选项。
你可以使用 JSON Schema Generator从真实样本生成基础 Schema,再人工补充范围、长度、正则、枚举和 additionalProperties 等业务规则。自动推断是起点,不是业务知识的替代品。
假设接口收到:
{
"id": "101",
"name": "Alice",
"email": "alice@example.com",
"active": "true"
}id 看起来像数字,active 看起来像布尔值,Linter 可以把它们标记为可疑字符串。但没有正式契约时,它不能证明这两个值一定错误。id 必须是整数,active 必须是布尔值。这里的失败不是语法错误,而是契约错误。这就是最关键的区别:
语法有效 ≠ 风格一致 ≠ 符合业务契约
| 对比维度 | JSON Validator | JSON Linter | JSON Schema |
|---|---|---|---|
| 检查语法 | 是 | 通常先要求语法有效 | Schema 本身也必须是合法 JSON |
| 检查字段类型 | 否 | 可以提示可疑类型 | 可以正式约束 |
| 检查必填字段 | 否 | 通常不能可靠判断 | 可以 |
| 检查命名风格 | 否 | 可以 | 通常不是主要用途 |
| 检查数值范围 | 否 | 可能给建议 | 可以使用 minimum、maximum |
| 统一行业标准 | JSON 语法有标准 | 规则因工具和团队而异 | 有明确 Draft 与词汇规范 |
| 适合编辑时反馈 | 是 | 是 | 是,需要 Schema Validator |
| 适合 API 契约 | 不够 | 不够 | 是 |
| 结果性质 | 语法错误 | 警告或规则违规 | 契约通过或失败 |
在 API、配置文件或数据导入流程中,可以按下面顺序执行:
Schema 也不能表达所有业务逻辑。例如“结束时间必须晚于开始时间”“用户必须有权访问该项目”通常仍需要应用代码或专门规则。不要把 Schema 验证通过等同于业务操作一定安全。
在 CI/CD 中,这四层可以分别失败并给出不同信息:语法失败应立即停止;Lint 警告可以按团队策略处理;Schema 失败通常应阻止部署或数据进入下游;业务失败则需要领域相关的错误说明。
下面是一个最小 JavaScript 示例。为了让重点保持清晰,示例只使用 type 和 required,没有引入额外的 format 插件。
import Ajv from "ajv";
const schema = {
type: "object",
properties: {
id: { type: "integer" },
name: { type: "string" },
active: { type: "boolean" }
},
required: ["id", "name"],
additionalProperties: false
};
const data = {
id: "101",
name: "Alice",
active: true
};
const ajv = new Ajv({ allErrors: true });
const validate = ajv.compile(schema);
if (!validate(data)) {
console.log(validate.errors);
}AJV 会报告 id 类型不符合 integer。其官方指南推荐复用已经编译的验证函数,而不是为每条数据重复编译同一份 Schema。AJV 入门指南
但这段代码仍假设 data 已经是 JavaScript 值。如果输入来自网络中的原始字符串,仍然需要先解析 JSON;语法错误和 Schema 错误最好分别处理,才能给使用者准确的反馈。
不对。语法 Validator 只证明文本可解析。即使 Schema Validator 通过,也只证明数据满足这份 Schema,不能证明 Schema 覆盖了全部业务要求。
不一定。Lint 规则应服务于明确的团队约定。规则不适合当前数据源时,应调整规则或记录例外,而不是机械修改数据含义。
不对。单个样本无法可靠推断哪些字段可选,也无法知道未来允许的范围、枚举和边界条件。应使用多个代表性样本,并由了解业务的人复核。
不能。Schema 用于描述和验证数据,不负责补逗号、修引号或恢复被截断的内容。语法无效时,应先使用 Validator 或 Repair 工具。
JSON Validator、JSON Linter 和 JSON Schema 分别守住三条不同的边界:
最可靠的方案不是从中只选一个,而是按顺序组合使用。先让文本能够被正确解析,再检查团队质量规则,最后使用经过复核的 Schema 验证真实业务约束。
你可以从 JSON Validator开始检查语法,使用 JSON Linter发现质量问题,再通过 JSON Schema Generator建立可维护的数据契约。所有这些操作都可以在浏览器本地完成。
致力于为开发者提供最佳的 JSON 处理工具
更多文章即将发布...
返回博客关于跟进更新、选题方向与互动反馈。
收藏本博客列表页,并在首页与工具聚合页留意指南入口。阅读文章无需注册或邮件订阅。
围绕 JSON 校验、格式化、转换与调试流程,以及 JSON Work 工具更新,与在线工具的本地能力一一对应。
可以。请通过关于页的联系方式或 GitHub 反馈;我们会优先安排贴近真实开发场景的教程。