JSON.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:5k
源码类别:

中间件编程

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.0.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. /**
  8.  * @class Ext.util.JSON
  9.  * Modified version of Douglas Crockford"s json.js that doesn"t
  10.  * mess with the Object prototype
  11.  * http://www.json.org/js.html
  12.  * @singleton
  13.  */
  14. Ext.util.JSON = new (function(){
  15.     var useHasOwn = !!{}.hasOwnProperty,
  16.         isNative = function() {
  17.             var useNative = null;
  18.             return function() {
  19.                 if (useNative === null) {
  20.                     useNative = Ext.USE_NATIVE_JSON && window.JSON && JSON.toString() == '[object JSON]';
  21.                 }
  22.         
  23.                 return useNative;
  24.             };
  25.         }(),
  26.         pad = function(n) {
  27.             return n < 10 ? "0" + n : n;
  28.         },
  29.         doDecode = function(json){
  30.             return eval("(" + json + ')');    
  31.         },
  32.         doEncode = function(o){
  33.             if(typeof o == "undefined" || o === null){
  34.                 return "null";
  35.             }else if(Ext.isArray(o)){
  36.                 return encodeArray(o);
  37.             }else if(Object.prototype.toString.apply(o) === '[object Date]'){
  38.                 return Ext.util.JSON.encodeDate(o);
  39.             }else if(typeof o == "string"){
  40.                 return encodeString(o);
  41.             }else if(typeof o == "number"){
  42.                 return isFinite(o) ? String(o) : "null";
  43.             }else if(typeof o == "boolean"){
  44.                 return String(o);
  45.             }else {
  46.                 var a = ["{"], b, i, v;
  47.                 for (i in o) {
  48.                     if(!useHasOwn || o.hasOwnProperty(i)) {
  49.                         v = o[i];
  50.                         switch (typeof v) {
  51.                         case "undefined":
  52.                         case "function":
  53.                         case "unknown":
  54.                             break;
  55.                         default:
  56.                             if(b){
  57.                                 a.push(',');
  58.                             }
  59.                             a.push(doEncode(i), ":",
  60.                                     v === null ? "null" : doEncode(v));
  61.                             b = true;
  62.                         }
  63.                     }
  64.                 }
  65.                 a.push("}");
  66.                 return a.join("");
  67.             }    
  68.         },
  69.         m = {
  70.             "b": '\b',
  71.             "t": '\t',
  72.             "n": '\n',
  73.             "f": '\f',
  74.             "r": '\r',
  75.             '"' : '\"',
  76.             "\": '\\'
  77.         },
  78.         encodeString = function(s){
  79.             if (/["\x00-x1f]/.test(s)) {
  80.                 return '"' + s.replace(/([x00-x1f\"])/g, function(a, b) {
  81.                     var c = m[b];
  82.                     if(c){
  83.                         return c;
  84.                     }
  85.                     c = b.charCodeAt();
  86.                     return "\u00" +
  87.                         Math.floor(c / 16).toString(16) +
  88.                         (c % 16).toString(16);
  89.                 }) + '"';
  90.             }
  91.             return '"' + s + '"';
  92.         },
  93.         encodeArray = function(o){
  94.             var a = ["["], b, i, l = o.length, v;
  95.                 for (i = 0; i < l; i += 1) {
  96.                     v = o[i];
  97.                     switch (typeof v) {
  98.                         case "undefined":
  99.                         case "function":
  100.                         case "unknown":
  101.                             break;
  102.                         default:
  103.                             if (b) {
  104.                                 a.push(',');
  105.                             }
  106.                             a.push(v === null ? "null" : Ext.util.JSON.encode(v));
  107.                             b = true;
  108.                     }
  109.                 }
  110.                 a.push("]");
  111.                 return a.join("");
  112.         };
  113.     this.encodeDate = function(o){
  114.         return '"' + o.getFullYear() + "-" +
  115.                 pad(o.getMonth() + 1) + "-" +
  116.                 pad(o.getDate()) + "T" +
  117.                 pad(o.getHours()) + ":" +
  118.                 pad(o.getMinutes()) + ":" +
  119.                 pad(o.getSeconds()) + '"';
  120.     };
  121.     /**
  122.      * Encodes an Object, Array or other value
  123.      * @param {Mixed} o The variable to encode
  124.      * @return {String} The JSON string
  125.      */
  126.     this.encode = function() {
  127.         var ec;
  128.         return function(o) {
  129.             if (!ec) {
  130.                 // setup encoding function on first access
  131.                 ec = isNative() ? JSON.stringify : doEncode;
  132.             }
  133.             return ec(o);
  134.         };
  135.     }();
  136.     /**
  137.      * Decodes (parses) a JSON string to an object. If the JSON is invalid, this function throws a SyntaxError unless the safe option is set.
  138.      * @param {String} json The JSON string
  139.      * @return {Object} The resulting object
  140.      */
  141.     this.decode = function() {
  142.         var dc;
  143.         return function(json) {
  144.             if (!dc) {
  145.                 // setup decoding function on first access
  146.                 dc = isNative() ? JSON.parse : doDecode;
  147.             }
  148.             return dc(json);
  149.         };
  150.     }();
  151. })();
  152. /**
  153.  * Shorthand for {@link Ext.util.JSON#encode}
  154.  * @param {Mixed} o The variable to encode
  155.  * @return {String} The JSON string
  156.  * @member Ext
  157.  * @method encode
  158.  */
  159. Ext.encode = Ext.util.JSON.encode;
  160. /**
  161.  * Shorthand for {@link Ext.util.JSON#decode}
  162.  * @param {String} json The JSON string
  163.  * @param {Boolean} safe (optional) Whether to return null or throw an exception if the JSON is invalid.
  164.  * @return {Object} The resulting object
  165.  * @member Ext
  166.  * @method decode
  167.  */
  168. Ext.decode = Ext.util.JSON.decode;