aboutsummaryrefslogtreecommitdiffstats
path: root/src/JSON.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/JSON.js')
-rw-r--r--src/JSON.js149
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();
- }
-}