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/