JSON 规范与 RFC 标准速查本文整理 JSONJavaScript Object Notation的官方规范与 RFC 文档、格式规范语法与数据类型、版本演进、MIME 类型以及相关标准ECMA-404、JSON Schema便于查阅与引用。适合前后端开发、API 设计与协议实现的读者。目录当前标准RFC 8259JSON 格式规范RFC 版本演进ECMA 与 ISO 标准MIME 类型application/json相关规范JSON Schema小结与速查延伸阅读一、当前标准RFC 8259RFC 8259是当前 JSON 的IETF 互联网标准于 2017 年 12 月发布并被定为STD 90。项目说明标题The JavaScript Object Notation (JSON) Data Interchange Format状态Internet StandardSTD 90ObsoletesRFC 7159定义轻量级、基于文本、语言无关的数据交换格式语法源自 ECMAScriptRFC 8259 统一了与其它 JSON 规范的不一致之处修正了既有错误并加入了基于实践的可互操作指导。二、JSON 格式规范以下格式规则以RFC 8259与ECMA-404为准是判断“是否合法 JSON”的依据。2.1 顶层与数据类型一份合法的JSON 文本由且仅由**一个 JSON 值value**组成。该值可以是以下六种类型之一类型说明示例object无序的「名称/值」对集合名称键必须是字符串{}、{a:1,b:true}array有序的值列表[]、[1,2,x]string双引号包围的 Unicode 字符序列支持转义hello、say \hi\number十进制数含整数、小数、指数形式0、3.14、-1e2boolean字面量true或falsetrue、falsenull字面量nullnull顶层可以是其中任意一种不限于 object 或 array。例如only a string、42、null都是合法 JSON。JSON valueobjectarraystringnumberbooleannull2.2 对象object形式{ }或{ member , member , ... }。memberstring : value即键为双引号字符串值为任意 JSON 值。键与键之间用逗号,分隔键名不可重复标准建议唯一解析器行为由实现决定。键必须是string不能是未加引号的标识符如{ a: 1 }非法应为{ a: 1 }。示例{name:Alice,age:30,active:true}。2.3 数组array形式[ ]或[ value , value , ... ]。元素为任意 JSON 值元素之间用逗号,分隔。元素顺序有意义。示例[1, two, null, [3, 4]]。2.4 字符串string由双引号包围。中间可包含 Unicode 字符含转义序列。常用转义转义含义\双引号\\反斜杠\/斜杠可写可不写\b退格\f换页\n换行\r回车\t制表符\uXXXX四位十六进制 Unicode 码点不支持单引号、未转义换行、或控制字符直接出现须用\uXXXX等形式。2.5 数字number十进制可含整数部分、小数部分、指数部分。格式要点前导零不允许如01非法可有-负号指数为e或E后跟可选/-与数字。示例0、42、-1、3.14、1e2、1.5e-3。2.6 空白与编码空白在 token 之间可插入空白字符spaceU0020、tab、换行、回车不影响解析。例如键值对、数组元素之间的空格与换行是允许的。编码RFC 8259 规定 JSON 使用UTF-8编码不再支持 RFC 4627 时代的 UTF-16/32。2.7 常见“非 JSON”写法无效或非标准写法问题单引号字符串x标准只认双引号未加引号的键{ a: 1 }键必须是a尾随逗号[1,2,]或{a:1,}标准不允许尾随逗号注释//或/* */标准不支持注释十六进制、NaN、Infinity标准中 number 仅十进制无 NaN/Infinity前导零01number 不允许三、RFC 版本演进JSON 的 IETF 规范经历了三代 RFC关系如下RFC发布时间状态说明RFC 46272006-07已废弃Obsoleted by RFC 7159首份 JSON RFC同时定义 JSON 语法与application/jsonMIME 类型RFC 71592014-03已废弃Obsoleted by RFC 8259放宽了部分语法如顶层可为任意类型与 ECMAScript 对齐RFC 82592017-12当前标准STD 90现行规范统一表述并增强可互操作性RFC 4627\n2006RFC 7159\n2014RFC 8259\n2017\nSTD 90查阅链接以 IETF 与 RFC Editor 为准当前标准https://www.rfc-editor.org/rfc/rfc8259历史与状态https://datatracker.ietf.org/doc/rfc8259/四、ECMA 与 ISO 标准除 IETF RFC 外JSON 语法还有国际标准形式与 RFC 8259 在时间与内容上对齐。标准说明ECMA-404ECMA International 发布的 JSON 语法标准第 2 版2017-12。仅定义合法 JSON 文本的语法不定义语义或各语言如何解析。ISO/IEC 21778与 ECMA-404 对应的ISO/IEC国际标准内容一致。ECMA-404 与 RFC 8259 在语法层面保持一致ECMA/ISO 侧重“语法标准”RFC 同时涵盖语法与在互联网中作为数据交换格式的用法如编码、MIME 等。五、MIME 类型application/json在 HTTP、邮件等协议中JSON 数据使用application/json作为 MIME 类型媒体类型。项目说明类型名application/json首次正式定义RFC 46272006当前由 RFC 8259 引用与沿用IANA 注册在 IANA 媒体类型列表中注册用于标识 JSON 格式数据编码JSON 为 UTF-8 编码的文本RFC 8259 规定 JSON 使用 UTF-8。旧规范中曾允许 UTF-16/32当前标准仅 UTF-8。在 HTTP 中设置示例Content-Type: application/json; charsetutf-8其中charsetutf-8可选RFC 8259 下 JSON 即 UTF-8。六、相关规范JSON SchemaJSON Schema不是 JSON 语法本身而是用来描述与校验JSON 文档结构的规范例如约束类型、必填字段、格式等。项目说明用途描述 JSON 文档结构、校验validation、文档生成、交互控制媒体类型application/schemajsonJSON Schema 文档自身多为 JSON 格式与 RFC 8259 关系基于 JSON 语法RFC 8259/ECMA-404在其之上增加“结构描述”的语义标准状态有 IETF 草案如 draft-bhutton-json-schema-*广泛使用的为 json-schema.org 及各实现库若需“JSON 的语法规范”则看 RFC 8259 / ECMA-404若需“如何描述/校验 JSON 结构”则看 JSON Schema。小结与速查要点归纳需求查阅JSON 格式规范语法RFC 8259/ECMA-404六种类型object/array/string/number/boolean/null、双引号字符串、无注释/无尾随逗号、UTF-8JSON 数据交换与 MIMERFC 8259STD 90application/json描述/校验 JSON 结构JSON Schema独立于 RFC 8259规范速查表文档说明RFC 8259当前 JSON 互联网标准STD 90定义语法与格式六类型、编码、对象/数组/字符串/数字规则RFC 7159已废弃被 RFC 8259 替代RFC 4627已废弃首份 JSON RFC 及 application/json 定义ECMA-404JSON 语法国际标准与 RFC 8259 语法一致ISO/IEC 21778与 ECMA-404 等同的 ISO 标准application/jsonJSON 的 MIME 类型IANA 注册延伸阅读RFC 8259 全文https://www.rfc-editor.org/rfc/rfc8259ECMA-404https://ecma-international.org/publications-and-standards/standards/ecma-404/IANA 媒体类型https://www.iana.org/assignments/media-types/application/jsonJSON Schemahttps://json-schema.org 及 IETF 相关 draft。根据 IETF RFC、ECMA、IANA 等公开标准文档整理。