JSON

JSON 对象包含用于解析 JavaScript Object Notation  (JSON) 的方法,并将值转换为JSON。它不能被调用或者作为构造函数,除了它的两个方法属性,它本身并没有有趣的功能。

描述

JavaScript对象注释

JSON 是一种语法用来序列化对象、数组、数值、字符串、布尔值和 null 。它基于 JavaScript 语法,但与之不同:一些JavaScript不是JSON,一些JSON不是JavaScript参考 JSON:不是JavaScript 的子集。

JavaScript 与 JSON 的区别
JavaScript类型 JSON 区别
对象和数组

属性名称必须是双引号字符串;后缀逗号被禁止。最后一个属性后面不能有逗号。

数值 前导0是禁止的(在JSON.stringify 0将被忽略,但在JSON.parse它将抛出SyntaxError);小数点后必须至少有一位数字。
字符串

只有有限的一些字符可能会被转义;禁止某些控制字符; Unicode 行分隔符 (U+2028) 和段分隔符 (U+2029)被允许 ; 字符串必须是双引号。请参见以下示例,其中 JSON.parse() 能够正常解析,但把它当作JavaScript解析时会抛出 SyntaxError 错误:

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

JSON5

规范

规范 状态 说明
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)

相关链接

文档标签和贡献者