123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The source code</title>
- <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
- <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
- <style type="text/css">
- .highlight { display: block; background-color: #ddd; }
- </style>
- <script type="text/javascript">
- function highlight() {
- document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
- }
- </script>
- </head>
- <body onload="prettyPrint(); highlight();">
- <pre class="prettyprint lang-js"><span id='Ext-JSON'>/**
- </span> * Modified version of [Douglas Crockford's JSON.js][dc] that doesn't
- * mess with the Object prototype.
- *
- * [dc]: http://www.json.org/js.html
- *
- * @singleton
- */
- Ext.JSON = (new(function() {
- var me = this,
- encodingFunction,
- decodingFunction,
- useNative = null,
- useHasOwn = !! {}.hasOwnProperty,
- isNative = function() {
- if (useNative === null) {
- useNative = Ext.USE_NATIVE_JSON && window.JSON && JSON.toString() == '[object JSON]';
- }
- return useNative;
- },
- pad = function(n) {
- return n < 10 ? "0" + n : n;
- },
- doDecode = function(json) {
- return eval("(" + json + ')');
- },
- doEncode = function(o, newline) {
- // http://jsperf.com/is-undefined
- if (o === null || o === undefined) {
- return "null";
- } else if (Ext.isDate(o)) {
- return Ext.JSON.encodeDate(o);
- } else if (Ext.isString(o)) {
- return Ext.JSON.encodeString(o);
- } else if (typeof o == "number") {
- //don't use isNumber here, since finite checks happen inside isNumber
- return isFinite(o) ? String(o) : "null";
- } else if (Ext.isBoolean(o)) {
- return String(o);
- }
- // Allow custom zerialization by adding a toJSON method to any object type.
- // Date/String have a toJSON in some environments, so check these first.
- else if (o.toJSON) {
- return o.toJSON();
- } else if (Ext.isArray(o)) {
- return encodeArray(o, newline);
- } else if (Ext.isObject(o)) {
- return encodeObject(o, newline);
- } else if (typeof o === "function") {
- return "null";
- }
- return 'undefined';
- },
- m = {
- "\b": '\\b',
- "\t": '\\t',
- "\n": '\\n',
- "\f": '\\f',
- "\r": '\\r',
- '"': '\\"',
- "\\": '\\\\',
- '\x0b': '\\u000b' //ie doesn't handle \v
- },
- charToReplace = /[\\\"\x00-\x1f\x7f-\uffff]/g,
- encodeString = function(s) {
- return '"' + s.replace(charToReplace, function(a) {
- var c = m[a];
- return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
- }) + '"';
- },
- //<debug>
- encodeArrayPretty = function(o, newline) {
- var len = o.length,
- cnewline = newline + ' ',
- sep = ',' + cnewline,
- a = ["[", cnewline], // Note newline in case there are no members
- i;
- for (i = 0; i < len; i += 1) {
- a.push(Ext.JSON.encodeValue(o[i], cnewline), sep);
- }
- // Overwrite trailing comma (or empty string)
- a[a.length - 1] = newline + ']';
- return a.join('');
- },
- encodeObjectPretty = function(o, newline) {
- var cnewline = newline + ' ',
- sep = ',' + cnewline,
- a = ["{", cnewline], // Note newline in case there are no members
- i;
- for (i in o) {
- if (!useHasOwn || o.hasOwnProperty(i)) {
- a.push(Ext.JSON.encodeValue(i) + ': ' + Ext.JSON.encodeValue(o[i], cnewline), sep);
- }
- }
- // Overwrite trailing comma (or empty string)
- a[a.length - 1] = newline + '}';
- return a.join('');
- },
- //</debug>
- encodeArray = function(o, newline) {
- //<debug>
- if (newline) {
- return encodeArrayPretty(o, newline);
- }
- //</debug>
- var a = ["[", ""], // Note empty string in case there are no serializable members.
- len = o.length,
- i;
- for (i = 0; i < len; i += 1) {
- a.push(Ext.JSON.encodeValue(o[i]), ',');
- }
- // Overwrite trailing comma (or empty string)
- a[a.length - 1] = ']';
- return a.join("");
- },
- encodeObject = function(o, newline) {
- //<debug>
- if (newline) {
- return encodeObjectPretty(o, newline);
- }
- //</debug>
- var a = ["{", ""], // Note empty string in case there are no serializable members.
- i;
- for (i in o) {
- if (!useHasOwn || o.hasOwnProperty(i)) {
- a.push(Ext.JSON.encodeValue(i), ":", Ext.JSON.encodeValue(o[i]), ',');
- }
- }
- // Overwrite trailing comma (or empty string)
- a[a.length - 1] = '}';
- return a.join("");
- };
-
- <span id='Ext-JSON-method-encodeString'> /**
- </span> * Encodes a String. This returns the actual string which is inserted into the JSON string as the literal
- * expression. **The returned value includes enclosing double quotation marks.**
- *
- * To override this:
- *
- * Ext.JSON.encodeString = function(s) {
- * return 'Foo' + s;
- * };
- *
- * @param {String} s The String to encode
- * @return {String} The string literal to use in a JSON string.
- * @method
- */
- me.encodeString = encodeString;
- <span id='Ext-JSON-method-encodeValue'> /**
- </span> * The function which {@link #encode} uses to encode all javascript values to their JSON representations
- * when {@link Ext#USE_NATIVE_JSON} is `false`.
- *
- * This is made public so that it can be replaced with a custom implementation.
- *
- * @param {Object} o Any javascript value to be converted to its JSON representation
- * @return {String} The JSON representation of the passed value.
- * @method
- */
- me.encodeValue = doEncode;
- <span id='Ext-JSON-method-encodeDate'> /**
- </span> * Encodes a Date. This returns the actual string which is inserted into the JSON string as the literal
- * expression. **The returned value includes enclosing double quotation marks.**
- *
- * The default return format is `"yyyy-mm-ddThh:mm:ss"`.
- *
- * To override this:
- *
- * Ext.JSON.encodeDate = function(d) {
- * return Ext.Date.format(d, '"Y-m-d"');
- * };
- *
- * @param {Date} d The Date to encode
- * @return {String} The string literal to use in a JSON string.
- */
- me.encodeDate = function(o) {
- return '"' + o.getFullYear() + "-"
- + pad(o.getMonth() + 1) + "-"
- + pad(o.getDate()) + "T"
- + pad(o.getHours()) + ":"
- + pad(o.getMinutes()) + ":"
- + pad(o.getSeconds()) + '"';
- };
- <span id='Ext-JSON-method-encode'> /**
- </span> * Encodes an Object, Array or other value.
- *
- * If the environment's native JSON encoding is not being used ({@link Ext#USE_NATIVE_JSON} is not set,
- * or the environment does not support it), then ExtJS's encoding will be used. This allows the developer
- * to add a `toJSON` method to their classes which need serializing to return a valid JSON representation
- * of the object.
- *
- * @param {Object} o The variable to encode
- * @return {String} The JSON string
- */
- me.encode = function(o) {
- if (!encodingFunction) {
- // setup encoding function on first access
- encodingFunction = isNative() ? JSON.stringify : me.encodeValue;
- }
- return encodingFunction(o);
- };
- <span id='Ext-JSON-method-decode'> /**
- </span> * Decodes (parses) a JSON string to an object. If the JSON is invalid, this function throws
- * a SyntaxError unless the safe option is set.
- *
- * @param {String} json The JSON string
- * @param {Boolean} [safe=false] True to return null, false to throw an exception if the JSON is invalid.
- * @return {Object} The resulting object
- */
- me.decode = function(json, safe) {
- if (!decodingFunction) {
- // setup decoding function on first access
- decodingFunction = isNative() ? JSON.parse : doDecode;
- }
- try {
- return decodingFunction(json);
- } catch (e) {
- if (safe === true) {
- return null;
- }
- Ext.Error.raise({
- sourceClass: "Ext.JSON",
- sourceMethod: "decode",
- msg: "You're trying to decode an invalid JSON String: " + json
- });
- }
- };
- })());
- <span id='Ext-method-encode'>/**
- </span> * Shorthand for {@link Ext.JSON#encode}
- * @member Ext
- * @method encode
- * @inheritdoc Ext.JSON#encode
- */
- Ext.encode = Ext.JSON.encode;
- <span id='Ext-method-decode'>/**
- </span> * Shorthand for {@link Ext.JSON#decode}
- * @member Ext
- * @method decode
- * @inheritdoc Ext.JSON#decode
- */
- Ext.decode = Ext.JSON.decode;</pre>
- </body>
- </html>
|