JSON 与 JavaScript 对象字面量的区别

JSON 看起来像 JavaScript 对象字面量,但它是一种更小、语法更严格、不包含可执行值的数据格式。

简短版本

JavaScript 对象字面量是源代码,JSON 是数据交换格式。两者重合的部分足以让人混淆,但规则不同:JSON 的键和字符串必须用双引号;JSON 没有注释;JSON 也无法表示函数、undefined、NaN、Infinity、Date 对象或正则表达式。

合法的 JSON 值

一份 JSON 文档可以包含对象、数组、字符串、数字、布尔或 null。字符串必须用双引号;对象的键也必须是双引号字符串。数字不能使用 JavaScript 专有的写法,例如十六进制、NaN、Infinity 或数字分隔符。

  • 合法的 JSON 字符串:"hello"
  • 合法的 JSON 布尔:true
  • 合法的 JSON null:null
  • 合法的 JSON 对象键:"name"

合法的 JavaScript 但不是合法 JSON

{ name: 'Ada', active: true, createdAt: new Date(), onSave() { return true }, tags: ['dev',], }

对应的合法 JSON

{ "name": "Ada", "active": true, "createdAt": "2026-05-13T00:00:00.000Z", "tags": ["dev"] }

为什么 API 会拒绝看起来像 JavaScript 的数据

API 服务端通常用 JSON 解析器解析请求体,而不是 JavaScript 引擎。这既是安全也是兼容性的考量:所有语言都能解析同样的数据,而不需要执行代码。如果请求体里出现注释、方法、undefined 或 new Date(),服务端就无法把它当作普通数据处理。

如何安全地转换

把可执行的或语言特有的值换成普通数据。日期改成字符串,缺失值用 null 或干脆省略键,注释挪到文档里,函数则用显式数据字段(比如策略名或类型值)来表示。