JSON

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

JSON 命名空间对象包含用于解析 JavaScript 对象表示法JSON)和将值转换为 JSON 字符串的静态方法。

描述

与大多数全局对象不同,JSON 不是一个构造函数。不能将它与 new 运算符 一起使用,也不能将 JSON 对象作为函数调用。JSON` 的所有属性和方法都是静态的(就像 Math 对象一样)。

JavaScript 与 JSON 的区别

JSON 是一种语法,用来序列化对象、数组、数值、字符串、布尔值和 null。它基于 JavaScript 语法,但与之不同:大部分 JavaScript 不是 JSON。例如:

对象和数组

属性名称必须是双引号括起来的字符串;禁止出现尾随逗号

数值

禁止出现前导零。小数点后必须至少有一位数字。不支持 NaNInfinity

任何 JSON 文本都是有效的 JavaScript 表达式,但仅限于 JSON 超集修订之后。在修订之前,U+2028 行分隔符和 U+2029 段分隔符允许在 JSON 的字符串字面量和属性键中使用;但在 JavaScript 字符串字面量中使用同样的分隔符会导致 SyntaxError

其他区别包括只允许双引号字符串,不支持 undefined 或注释。对于希望使用基于 JSON 的更人性化配置格式的用户,有 Babel 编译器使用的 JSON5,以及更常用的 YAML

在 JavaScript 对象字面量与 JSON 中,相同的文本可能代表不同的值。如需了解更多信息,请参阅对象字面量语法与 JSON 的对比

完整的 JSON 语法

有效的 JSON 语法由以下语法正式定义,该语法用 ABNF 表示,抄自 IETF JSON 标准(RFC)

JSON-text = object / array
begin-array     = ws %x5B ws  ; [ 左方括号
begin-object    = ws %x7B ws  ; { 左大括号
end-array       = ws %x5D ws  ; ] 右方括号
end-object      = ws %x7D ws  ; } 右大括号
name-separator  = ws %x3A ws  ; : 冒号
value-separator = ws %x2C ws  ; , 逗号
ws = *(
     %x20 /              ; 空格
     %x09 /              ; 垂直制表符
     %x0A /              ; 换行符
     %x0D                ; 回车符
     )
value = false / null / true / object / array / number / string
false = %x66.61.6c.73.65   ; false
null  = %x6e.75.6c.6c      ; null
true  = %x74.72.75.65      ; true
object = begin-object [ member *( value-separator member ) ]
         end-object
member = string name-separator value
array = begin-array [ value *( value-separator value ) ] end-array
number = [ minus ] int [ frac ] [ exp ]
decimal-point = %x2E       ; .
digit1-9 = %x31-39         ; 1-9
e = %x65 / %x45            ; e E
exp = e [ minus / plus ] 1*DIGIT
frac = decimal-point 1*DIGIT
int = zero / ( digit1-9 *DIGIT )
minus = %x2D               ; -
plus = %x2B                ; +
zero = %x30                ; 0
string = quotation-mark *char quotation-mark
char = unescaped /
    escape (
        %x22 /          ; "    引号     U+0022
        %x5C /          ; \    反斜杠   U+005C
        %x2F /          ; /    正斜杠   U+002F
        %x62 /          ; b    退格符   U+0008
        %x66 /          ; f    换页符   U+000C
        %x6E /          ; n    换行符   U+000A
        %x72 /          ; r    回车符   U+000D
        %x74 /          ; t    制表符   U+0009
        %x75 4HEXDIG )  ; uXXXX        U+XXXX
escape = %x5C              ; \
quotation-mark = %x22      ; "
unescaped = %x20-21 / %x23-5B / %x5D-10FFFF
HEXDIG = DIGIT / %x41-46 / %x61-66   ; 0-9, A-F, or a-f
       ; HEXDIG 等效于 [RFC5234] 中的 HEXDIG 规则
DIGIT = %x30-39            ; 0-9
      ; DIGIT 等效于 [RFC5234] 的 DIGIT 规则

无关紧要的空白符可以出现在任何地方,但不包括在 JSONNumber(数字不得包含空白)或 JSONString(字符串中的相应字符会被解释为空白,否则会导致错误)中。制表符(U+0009)、回车符(U+000D)、换行符(U+000A)和空格(U+0020)字符是唯一有效的空白字符。

静态属性

JSON[Symbol.toStringTag]

[Symbol.toStringTag] 属性的初始值为字符串 "JSON"。该属性在 Object.prototype.toString() 中使用。

静态方法

JSON.parse()

解析 JSON 字符串并返回对应的值,可以额外传入一个转换函数,用来将生成的值和其属性,在返回之前进行某些修改。

JSON.stringify()

返回与指定值对应的 JSON 字符串,可以通过额外的参数,控制仅包含某些属性,或者以自定义方法来替换某些属性值。

示例

示例 JSON

json
{
  "browsers": {
    "firefox": {
      "name": "Firefox",
      "pref_url": "about:config",
      "releases": {
        "1": {
          "release_date": "2004-11-09",
          "status": "retired",
          "engine": "Gecko",
          "engine_version": "1.7"
        }
      }
    }
  }
}

你可以使用 JSON.parse() 方法将上述 JSON 字符串转化为 JavaScript 对象:

js
const jsonText = `{
  "browsers": {
    "firefox": {
      "name": "Firefox",
      "pref_url": "about:config",
      "releases": {
        "1": {
          "release_date": "2004-11-09",
          "status": "retired",
          "engine": "Gecko",
          "engine_version": "1.7"
        }
      }
    }
  }
}`;

console.log(JSON.parse(jsonText));

规范

Specification
ECMAScript Language Specification
# sec-json-object

浏览器兼容性

BCD tables only load in the browser

参见