如何在线验证JSON:开发者实用指南与示例

阅读时间 8 分钟

学习如何轻松验证、格式化和调试JSON。常见错误、与XML的区别、最佳实践和免费在线工具。

什么是JSON,为什么需要验证

JSON(JavaScript Object Notation)是现代Web开发中最广泛使用的数据交换格式。几乎所有REST API都以JSON格式返回数据,package.json和tsconfig.json等工具配置文件使用此格式,MongoDB等数据库也以JSON格式存储文档。

问题在于,一个错位的字符(多余的逗号、缺少的引号、未关闭的括号)就会使整个JSON无效并导致应用程序出错。API响应中的无效JSON会破坏前端。tsconfig.json中的语法错误会阻止TypeScript编译。

在使用前验证JSON可以避免数小时的调试。使用NexTools JSON验证器,你可以粘贴任何JSON,查看带有精确行号的错误,并自动获得格式化输出。

JSON基本语法:必须了解的规则

JSON有严格的语法规则。违反任何一条都会产生无效的JSON:

  • 键必须用双引号括起来:{"name": "Ana"}有效。{name: "Ana"}无效。
  • 字符串使用双引号,不能用单引号:"value"有效。'value'无效。
  • 不允许尾随逗号:{"a": 1, "b": 2}有效。{"a": 1, "b": 2,}无效。
  • 不允许注释:JSON中不能使用//或/* */。
  • 数字不带引号:{"age": 25}有效。{"age": "25"}可以工作但值是字符串而非数字。

JSON中允许的数据类型:

类型示例说明
String"你好世界"始终使用双引号
Number423.14-7整数或小数,不带引号
Booleantruefalse小写,不带引号
Nullnull小写,不带引号
Array[1, 2, 3]逗号分隔的值
Object{"key": "value"}键值对

JSON中最常见的10个错误

这些是你在使用JSON时最常遇到的错误:

  1. 最后一个元素后的逗号:
    {"items": [1, 2, 3,]} — 3后面的逗号无效。
  2. 使用单引号而非双引号:
    {'name': '张三'} — 应为{"name": "张三"}
  3. 键没有引号:
    {age: 30} — 应为{"age": 30}
  4. 未转义的控制字符:
    字符串中的制表符和换行符必须写成\t\n
  5. 字符串中未转义的引号:
    {"text": "他说"你好""} — 需要转义。
  6. 注释:
    JSON不支持任何形式的注释。
  7. NaN、Infinity或undefined:
    这些JavaScript值在JSON中无效。请使用null代替。
  8. 十六进制值:
    {"color": 0xFF0000}无效。使用{"color": "#FF0000"}
  9. 类型化数组中混合类型:
    [1, "二", true]是有效JSON,但许多API期望同质数组。
  10. BOM(字节顺序标记):
    某些编辑器在文件开头添加不可见字节,使JSON无效。始终保存为无BOM的UTF-8。

所有这些错误都会被JSON验证器自动检测,它会显示每个错误的精确行和位置。

如何格式化和压缩JSON

JSON可以两种方式呈现:格式化(pretty-print)便于人类阅读,压缩版便于高效传输。

格式化的JSON:

{
  "user": {
    "name": "小明",
    "age": 28,
    "active": true
  }
}

压缩的JSON(相同数据,更少字节):

{"user":{"name":"小明","age":28,"active":true}}

压缩版占用更少空间(适合API和存储),而格式化版更容易阅读和调试。

在JavaScript中:

JSON.stringify(data, null, 2)  // 2个空格缩进格式化
JSON.stringify(data)           // 压缩

压缩大型JSON文件请使用代码压缩工具,它可以处理JSON、CSS和JavaScript。

JSON vs XML:何时使用哪个

在JSON之前,XML是数据交换的主流格式。两者仍在使用,但用途不同:

特性JSONXML
可读性更简洁更冗长
大小小30-50%更大
数据类型String、Number、Boolean、Null、Array、Object一切都是文本
注释不支持支持
SchemaJSON SchemaXSD、DTD
主要用途REST API、配置SOAP、文档、RSS
解析原生JSON.parse()需要XML解析器

2026年,JSON在Web开发、API和移动应用中占主导地位。XML在遗留企业系统、RSS/Atom订阅源和DOCX等文档格式中继续使用。

日常使用JSON的工具

除了验证,这些辅助工具使工作更轻松:

在浏览器中:

  • JSON.parse(jsonString) — 将JSON字符串转换为JavaScript对象。如果JSON无效则抛出错误。
  • JSON.stringify(obj, null, 2) — 将对象转换为格式化的JSON。

JSON Schema:验证结构而非仅仅语法

语法验证只检查JSON是否格式正确。但在实际应用中,你还需要验证数据是否具有正确的结构。

这就是JSON Schema的作用——一种描述JSON文档结构的标准:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "required": ["name", "age", "email"],
  "properties": {
    "name": { "type": "string", "minLength": 1 },
    "age": { "type": "integer", "minimum": 0, "maximum": 150 },
    "email": { "type": "string", "format": "email" }
  }
}

使用这个schema,你可以自动验证任何用户JSON是否包含name(非空字符串)、age(0到150之间的整数)和email(有效格式)。Ajv(JavaScript)、jsonschema(Python)和Newtonsoft(.NET)等库实现了JSON Schema验证。

生产环境中使用JSON的最佳实践

这些做法将帮助你避免实际项目中的常见问题:

  • 始终验证来自外部源的JSON:来自API、用户上传文件或webhook的任何JSON在处理前都应在try-catch中通过JSON.parse()
  • 键使用camelCase:这是JavaScript/TypeScript的标准惯例。用userName而不是user_name
  • 避免超过3-4层嵌套:深度嵌套的JSON难以阅读、遍历和维护。
  • 不要在未加密的JSON中存储敏感数据:令牌、密码和私钥永远不应出现在日志或API响应的明文JSON中。
  • 使用null而非省略可选字段:{"middleName": null}比省略该字段更好。
  • 优雅地处理解析错误:不要向最终用户显示JSON.parse的原始错误。在内部记录日志并显示友好的消息。

试试这个工具:

打开工具

常见问题

为什么我的JSON在解析时显示'Unexpected token'

「Unexpected token」错误意味着JSON.parse遇到了意外字符。最常见的原因是:使用单引号而非双引号、最后一个元素后有逗号、JSON中有注释、或文件开头有不可见的BOM字符。将你的JSON粘贴到在线验证器中,查看错误的确切位置。

JSON文件中可以使用注释吗

不可以。JSON规范不允许任何形式的注释(既不能用//也不能用/* */)。如果需要带注释的JSON,可以使用JSONC(VS Code在settings.json中使用)、JSON5或YAML等替代格式。

JSON和JavaScript对象有什么区别

JavaScript对象可以有不带引号的键、函数作为值、undefined、Symbol和尾随逗号。JSON更严格:所有键必须有双引号,只允许string、number、boolean、null、array和object作为值,不允许尾随逗号和注释。

浏览器中处理多大的JSON算太大

大多数现代浏览器可以毫无问题地解析50-100MB的JSON。超过这个范围,解析可能会阻塞主线程并冻结界面。对于非常大的JSON,使用流式解析器如JSONStream或在服务器端处理数据。

如何将JSON转换为CSV或反之

JSON转CSV:如果JSON是具有相同键的对象数组,键成为列,每个对象成为一行。CSV转JSON:每行成为以表头为键的对象。可以用JavaScript编程实现或使用在线工具。

配置文件用JSON还是YAML更好

取决于使用场景。JSON更严格(歧义错误更少)、解析更快,是API的标准。YAML对人更可读、支持注释,在DevOps中流行(Docker Compose、GitHub Actions、Kubernetes)。对于人编辑的配置,YAML通常更好。对于机器间传输的数据,JSON是标准选择。