JSON
对象包含用于解析 JavaScript Object Notation (JSON) 的方法,并将值转换为JSON。它不能被调用或者作为构造函数,除了它的两个方法属性,它本身并没有有趣的功能。
描述
JavaScript对象注释
JSON 是一种语法用来序列化对象、数组、数值、字符串、布尔值和 null
。它基于 JavaScript 语法,但与之不同:一些JavaScript不是JSON,一些JSON不是JavaScript。参考 JSON:不是JavaScript 的子集。。
JavaScript类型 | JSON 区别 |
---|---|
对象和数组 |
属性名称必须是双引号字符串;后缀逗号被禁止。最后一个属性后面不能有逗号。 |
数值 | 前导0是禁止的(在JSON.stringify 0将被忽略,但在JSON.parse它将抛出SyntaxError);小数点后必须至少有一位数字。 |
字符串 |
只有有限的一些字符可能会被转义;禁止某些控制字符; Unicode 行分隔符 (U+2028) 和段分隔符 (U+2029)被允许 ; 字符串必须是双引号。请参见以下示例,其中 let code = '"\u2028\u2029"'; JSON.parse(code); // 工作正常 eval(code); // 失败 |
完整的JSON语法如下:
JSON = null or true or false or JSONNumber or JSONString or JSONObject or JSONArray JSONNumber = - PositiveNumber or PositiveNumber PositiveNumber = DecimalNumber or DecimalNumber . Digits or DecimalNumber . Digits ExponentPart or DecimalNumber ExponentPart DecimalNumber = 0 or OneToNine Digits ExponentPart = e Exponent or E Exponent Exponent = Digits or + Digits or - Digits Digits = Digit or Digits Digit Digit = 0 through 9 OneToNine = 1 through 9 JSONString = "" or " StringCharacters " StringCharacters = StringCharacter or StringCharacters StringCharacter StringCharacter = any character except " or \ or U+0000 through U+001F or EscapeSequence EscapeSequence = \" or \/ or \\ or \b or \f or \n or \r or \t or \u HexDigit HexDigit HexDigit HexDigit HexDigit = 0 through 9 or A through F or a through f JSONObject = { } or { Members } Members = JSONString : JSON or Members , JSONString : JSON JSONArray = [ ] or [ ArrayElements ] ArrayElements = JSON or ArrayElements , JSON
无效的空格可能存在于JSONNumber(数字必须不包含空格)或JSONString(其中它被解释为字符串中的相应字符,否则将导致错误)之外的任何位置。制表符(U + 0009),回车(U + 000D),换行(U + 000A)和空格(U + 0020)字符是唯一有效的空格字符。
方法
JSON.parse()
- 解析一个JSON字符串,可选地转换生成的值及其属性,并返回值。
JSON.stringify()
- 返回与指定值相对应的一个JSON字符串,可选地仅包含某些属性或以用户定义的方式替换属性值。
Polyfill
JSON
对象不被旧版本浏览器支持。你可以把下面代码放到脚本的开始位置,这样就可以在那些没有原生支持 JSON 对象的浏览器(比如IE6)中使用 JSON 对象。
以下算法是对原生 JSON对象的模仿:
if (!window.JSON) { window.JSON = { parse: function(sJSON) { return eval('(' + sJSON + ')'); }, stringify: (function () { var toString = Object.prototype.toString; var isArray = Array.isArray || function (a) { return toString.call(a) === '[object Array]'; }; var escMap = {'"': '\\"', '\\': '\\\\', '\b': '\\b', '\f': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t'}; var escFunc = function (m) { return escMap[m] || '\\u' + (m.charCodeAt(0) + 0x10000).toString(16).substr(1); }; var escRE = /[\\"\u0000-\u001F\u2028\u2029]/g; return function stringify(value) { if (value == null) { return 'null'; } else if (typeof value === 'number') { return isFinite(value) ? value.toString() : 'null'; } else if (typeof value === 'boolean') { return value.toString(); } else if (typeof value === 'object') { if (typeof value.toJSON === 'function') { return stringify(value.toJSON()); } else if (isArray(value)) { var res = '['; for (var i = 0; i < value.length; i++) res += (i ? ', ' : '') + stringify(value[i]); return res + ']'; } else if (toString.call(value) === '[object Object]') { var tmp = []; for (var k in value) { if (value.hasOwnProperty(k)) tmp.push(stringify(k) + ': ' + stringify(value[k])); } return '{' + tmp.join(', ') + '}'; } } return '"' + value.toString().replace(escRE, escFunc) + '"'; }; })() }; }
JSON对象的更复杂的众所周知的 polyfills 是 JSON2 和 JSON3。
规范
规范 | 状态 | 说明 |
---|---|---|
ECMAScript 5.1 (ECMA-262) JSON |
Standard | Initial definition. |
ECMAScript 2015 (6th Edition, ECMA-262) JSON |
Standard | |
ECMAScript Latest Draft (ECMA-262) JSON |
Living Standard |
浏览器兼容性
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (Yes) | 3.5 (1.9.1) | 8.0 | 10.5 | 4.0 |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | 1.0 (1.0) | (Yes) | (Yes) | (Yes) |
相关链接
Date.prototype.toJSON()
- https://unicode-table.com/en/2028/
- https://unicode-table.com/en/2029/