Apply your JS skills to key Mozilla projects as an MDN Fellow! http://mzl.la/MDNFellowship

mozilla
您的搜索结果

    JSON

    概述

    JSON对象包含了两个主要方法,一个方法用来将JavaScript值转换为JavaScript Object Notation (JSON)格式的字符串,另外一个方法用来将JSON字符串转换为JavaScript值。

    描述

    JavaScript Object Notation

    JSON 是一种用来序列化对象、数组、数值、字符串、布尔值和 null 的语法。它基于 JavaScript 语法,但是又有区别:一些 JavaScript 值不是 JSON,而某些 JSON 不是 JavaScript 值。参考 JSON: The JavaScript subset that isn't

    JavaScript 与 JSON 的区别
    JavaScript类型 JSON与之区别
    对象和数组 属性名称必须用双引号包裹;最后一个属性后面不能有逗号。
    数值 前导0不能使用;小数点后面至少有一个数字。
    字符串

    Only a limited sets of characters may be escaped; certain control characters are prohibited; the Unicode line separator (U+2028) and paragraph separator (U+2029) characters are permitted; strings must be double-quoted. See the following example where JSON.parse() works fine and a SyntaxError is thrown when evaluating the code as JavaScript:

    var code = '"\u2028\u2029"';
    JSON.parse(code); // works fine
    eval(code); // fails
    

    完整的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
    

    空白字符可以出现在任意位置,但是数值类型的数字中间不能有空白字符,字符串中间不能随意添加空白字符,因为添加的空白字符会被解释为相应的字符值,从而引起错误。有效空白字符只包括制表符 (U+0009)、回车符 (U+000D)、换行符 (U+000A) 和空格 (U+0020) 。

    方法

    JSON.parse()
    解析JSON字符串, 可以选择改变前面解析后的值及其属性,然后返回解析的值。
    JSON.stringify()
    返回指定值的 JSON 字符串,可以自定义只包含某些特定的属性或替换属性值。

    浏览器兼容性

    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  
    ECMAScript 6 (ECMA-262)
    JSON
    Draft  

    浏览器兼容性

    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)

    数据来源 Kangax's compat table.

    相关链接

    文档标签和贡献者

    此页面的贡献者有: fscholz, AlexChao, ziyunfei, Yaty, teoli, Wladimir_Palant
    最后编辑者: Yaty,