JSON.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:6k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.1.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(!Ext.isDefined(o) || o === null){
  34.                 return "null";
  35.             }else if(Ext.isArray(o)){
  36.                 return encodeArray(o);
  37.             }else if(Ext.isDate(o)){
  38.                 return Ext.util.JSON.encodeDate(o);
  39.             }else if(Ext.isString(o)){
  40.                 return encodeString(o);
  41.             }else if(typeof o == "number"){
  42.                 //don't use isNumber here, since finite checks happen inside isNumber
  43.                 return isFinite(o) ? String(o) : "null";
  44.             }else if(Ext.isBoolean(o)){
  45.                 return String(o);
  46.             }else {
  47.                 var a = ["{"], b, i, v;
  48.                 for (i in o) {
  49.                     // don't encode DOM objects
  50.                     if(!o.getElementsByTagName){
  51.                         if(!useHasOwn || o.hasOwnProperty(i)) {
  52.                             v = o[i];
  53.                             switch (typeof v) {
  54.                             case "undefined":
  55.                             case "function":
  56.                             case "unknown":
  57.                                 break;
  58.                             default:
  59.                                 if(b){
  60.                                     a.push(',');
  61.                                 }
  62.                                 a.push(doEncode(i), ":",
  63.                                         v === null ? "null" : doEncode(v));
  64.                                 b = true;
  65.                             }
  66.                         }
  67.                     }
  68.                 }
  69.                 a.push("}");
  70.                 return a.join("");
  71.             }    
  72.         },
  73.         m = {
  74.             "b": '\b',
  75.             "t": '\t',
  76.             "n": '\n',
  77.             "f": '\f',
  78.             "r": '\r',
  79.             '"' : '\"',
  80.             "\": '\\'
  81.         },
  82.         encodeString = function(s){
  83.             if (/["\x00-x1f]/.test(s)) {
  84.                 return '"' + s.replace(/([x00-x1f\"])/g, function(a, b) {
  85.                     var c = m[b];
  86.                     if(c){
  87.                         return c;
  88.                     }
  89.                     c = b.charCodeAt();
  90.                     return "\u00" +
  91.                         Math.floor(c / 16).toString(16) +
  92.                         (c % 16).toString(16);
  93.                 }) + '"';
  94.             }
  95.             return '"' + s + '"';
  96.         },
  97.         encodeArray = function(o){
  98.             var a = ["["], b, i, l = o.length, v;
  99.                 for (i = 0; i < l; i += 1) {
  100.                     v = o[i];
  101.                     switch (typeof v) {
  102.                         case "undefined":
  103.                         case "function":
  104.                         case "unknown":
  105.                             break;
  106.                         default:
  107.                             if (b) {
  108.                                 a.push(',');
  109.                             }
  110.                             a.push(v === null ? "null" : Ext.util.JSON.encode(v));
  111.                             b = true;
  112.                     }
  113.                 }
  114.                 a.push("]");
  115.                 return a.join("");
  116.         };
  117.     this.encodeDate = function(o){
  118.         return '"' + o.getFullYear() + "-" +
  119.                 pad(o.getMonth() + 1) + "-" +
  120.                 pad(o.getDate()) + "T" +
  121.                 pad(o.getHours()) + ":" +
  122.                 pad(o.getMinutes()) + ":" +
  123.                 pad(o.getSeconds()) + '"';
  124.     };
  125.     /**
  126.      * Encodes an Object, Array or other value
  127.      * @param {Mixed} o The variable to encode
  128.      * @return {String} The JSON string
  129.      */
  130.     this.encode = function() {
  131.         var ec;
  132.         return function(o) {
  133.             if (!ec) {
  134.                 // setup encoding function on first access
  135.                 ec = isNative() ? JSON.stringify : doEncode;
  136.             }
  137.             return ec(o);
  138.         };
  139.     }();
  140.     /**
  141.      * Decodes (parses) a JSON string to an object. If the JSON is invalid, this function throws a SyntaxError unless the safe option is set.
  142.      * @param {String} json The JSON string
  143.      * @return {Object} The resulting object
  144.      */
  145.     this.decode = function() {
  146.         var dc;
  147.         return function(json) {
  148.             if (!dc) {
  149.                 // setup decoding function on first access
  150.                 dc = isNative() ? JSON.parse : doDecode;
  151.             }
  152.             return dc(json);
  153.         };
  154.     }();
  155. })();
  156. /**
  157.  * Shorthand for {@link Ext.util.JSON#encode}
  158.  * @param {Mixed} o The variable to encode
  159.  * @return {String} The JSON string
  160.  * @member Ext
  161.  * @method encode
  162.  */
  163. Ext.encode = Ext.util.JSON.encode;
  164. /**
  165.  * Shorthand for {@link Ext.util.JSON#decode}
  166.  * @param {String} json The JSON string
  167.  * @param {Boolean} safe (optional) Whether to return null or throw an exception if the JSON is invalid.
  168.  * @return {Object} The resulting object
  169.  * @member Ext
  170.  * @method decode
  171.  */
  172. Ext.decode = Ext.util.JSON.decode;