diff options
Diffstat (limited to 'src/JSON.js')
| -rw-r--r-- | src/JSON.js | 149 |
1 files changed, 16 insertions, 133 deletions
diff --git a/src/JSON.js b/src/JSON.js index bcb5fabe..e6d48c86 100644 --- a/src/JSON.js +++ b/src/JSON.js @@ -1,5 +1,20 @@ 'use strict'; +var jsonReplacer = function(key, value) { + var val = value; + if (/^\$+/.test(key)) { + val = undefined; + } else if (isWindow(value)) { + val = '$WINDOW'; + } else if (value && document === value) { + val = '$DOCUMENT'; + } else if (isScope(value)) { + val = '$SCOPE'; + } + + return val; +}; + /** * @ngdoc function * @name angular.toJson @@ -13,9 +28,7 @@ * @returns {string} Jsonified string representing `obj`. */ function toJson(obj, pretty) { - var buf = []; - toJsonArray(buf, obj, pretty ? "\n " : null, []); - return buf.join(''); + return JSON.stringify(obj, jsonReplacer, pretty ? ' ' : null); } /** @@ -34,133 +47,3 @@ function fromJson(json) { ? JSON.parse(json) : json; } - - -function jsonDateToString(date){ - if (!date) return date; - var isoString = date.toISOString ? date.toISOString() : ''; - return (isoString.length==24) - ? isoString - : padNumber(date.getUTCFullYear(), 4) + '-' + - padNumber(date.getUTCMonth() + 1, 2) + '-' + - padNumber(date.getUTCDate(), 2) + 'T' + - padNumber(date.getUTCHours(), 2) + ':' + - padNumber(date.getUTCMinutes(), 2) + ':' + - padNumber(date.getUTCSeconds(), 2) + '.' + - padNumber(date.getUTCMilliseconds(), 3) + 'Z'; -} - -function quoteUnicode(string) { - var chars = ['"']; - for ( var i = 0; i < string.length; i++) { - var code = string.charCodeAt(i); - var ch = string.charAt(i); - switch(ch) { - case '"': chars.push('\\"'); break; - case '\\': chars.push('\\\\'); break; - case '\n': chars.push('\\n'); break; - case '\f': chars.push('\\f'); break; - case '\r': chars.push(ch = '\\r'); break; - case '\t': chars.push(ch = '\\t'); break; - default: - if (32 <= code && code <= 126) { - chars.push(ch); - } else { - var encode = "000" + code.toString(16); - chars.push("\\u" + encode.substring(encode.length - 4)); - } - } - } - chars.push('"'); - return chars.join(''); - } - - -function toJsonArray(buf, obj, pretty, stack) { - if (isObject(obj)) { - if (obj === window) { - buf.push('WINDOW'); - return; - } - - if (obj === document) { - buf.push('DOCUMENT'); - return; - } - - if (includes(stack, obj)) { - buf.push('RECURSION'); - return; - } - stack.push(obj); - } - if (obj === null) { - buf.push('null'); - } else if (obj instanceof RegExp) { - buf.push(quoteUnicode(obj.toString())); - } else if (isFunction(obj)) { - return; - } else if (isBoolean(obj)) { - buf.push('' + obj); - } else if (isNumber(obj)) { - if (isNaN(obj)) { - buf.push('null'); - } else { - buf.push('' + obj); - } - } else if (isString(obj)) { - return buf.push(quoteUnicode(obj)); - } else if (isObject(obj)) { - if (isArray(obj)) { - buf.push("["); - var len = obj.length; - var sep = false; - for(var i=0; i<len; i++) { - var item = obj[i]; - if (sep) buf.push(","); - if (!(item instanceof RegExp) && (isFunction(item) || isUndefined(item))) { - buf.push('null'); - } else { - toJsonArray(buf, item, pretty, stack); - } - sep = true; - } - buf.push("]"); - } else if (isElement(obj)) { - // TODO(misko): maybe in dev mode have a better error reporting? - buf.push('DOM_ELEMENT'); - } else if (isDate(obj)) { - buf.push(quoteUnicode(jsonDateToString(obj))); - } else { - buf.push("{"); - if (pretty) buf.push(pretty); - var comma = false; - var childPretty = pretty ? pretty + " " : false; - var keys = []; - for(var k in obj) { - if (k!='this' && k!='$parent' && k.substring(0,2) != '$$' && obj.hasOwnProperty(k) && obj[k] !== undefined) { - keys.push(k); - } - } - keys.sort(); - for ( var keyIndex = 0; keyIndex < keys.length; keyIndex++) { - var key = keys[keyIndex]; - var value = obj[key]; - if (!isFunction(value)) { - if (comma) { - buf.push(","); - if (pretty) buf.push(pretty); - } - buf.push(quoteUnicode(key)); - buf.push(":"); - toJsonArray(buf, value, childPretty, stack); - comma = true; - } - } - buf.push("}"); - } - } - if (isObject(obj)) { - stack.pop(); - } -} |
