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.
* Some parts of this feature may have varying levels of support.
JSON
命名空间对象包含用于解析 JavaScript 对象表示法(JSON)和将值转换为 JSON 字符串的静态方法。
描述
JavaScript 与 JSON 的区别
JSON 是一种语法,用来序列化对象、数组、数值、字符串、布尔值和 null
。它基于 JavaScript 语法,但与之不同:大部分 JavaScript 不是 JSON。例如:
任何 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
{
"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 对象:
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