diff options
| author | Igor Minar | 2010-12-22 13:19:26 -0800 |
|---|---|---|
| committer | Igor Minar | 2010-12-22 14:16:36 -0800 |
| commit | e7a0fb250f6cc69c93daffe0d043d073fd488c03 (patch) | |
| tree | a799e9264a131a9124de7983b5655b9e97df44ba /src | |
| parent | e3ddc2bcc48ba6160455c4ffe35df87715c05693 (diff) | |
| download | angular.js-e7a0fb250f6cc69c93daffe0d043d073fd488c03.tar.bz2 | |
fromJson delegation to native JSON parser if available
- native parser delegation
- $xhr change to use native parser
Diffstat (limited to 'src')
| -rw-r--r-- | src/Angular.js | 3 | ||||
| -rw-r--r-- | src/JSON.js | 28 | ||||
| -rw-r--r-- | src/parser.js | 2 | ||||
| -rw-r--r-- | src/services.js | 2 |
4 files changed, 29 insertions, 6 deletions
diff --git a/src/Angular.js b/src/Angular.js index ea5d1ea1..991598e1 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -109,7 +109,8 @@ var _undefined = undefined, angularService = extensionMap(angular, 'service'), angularCallbacks = extensionMap(angular, 'callbacks'), nodeName, - rngScript = /^(|.*\/)angular(-.*?)?(\.min)?.js(\?[^#]*)?(#(.*))?$/; + rngScript = /^(|.*\/)angular(-.*?)?(\.min)?.js(\?[^#]*)?(#(.*))?$/, + DATE_ISOSTRING_LN = 24; /** * @workInProgress diff --git a/src/JSON.js b/src/JSON.js index 2906362c..399b2197 100644 --- a/src/JSON.js +++ b/src/JSON.js @@ -29,19 +29,41 @@ function toJson(obj, pretty) { * Deserializes a string in the JSON format. * * @param {string} json JSON string to deserialize. + * @param {boolean} [useNative=false] Use native JSON parser if available * @returns {Object|Array|Date|string|number} Deserialized thingy. */ -function fromJson(json) { +function fromJson(json, useNative) { if (!json) return json; + + var obj, p, expression; + try { - var p = parser(json, true); - var expression = p.primary(); + if (useNative && JSON && JSON.parse) { + obj = JSON.parse(json); + return transformDates(obj); + } + + p = parser(json, true); + expression = p.primary(); p.assertAllConsumed(); return expression(); + } catch (e) { error("fromJson error: ", json, e); throw e; } + + // TODO make foreach optionally recursive and remove this function + function transformDates(obj) { + if (isString(obj) && obj.length === DATE_ISOSTRING_LN) { + return angularString.toDate(obj); + } else if (isArray(obj) || isObject(obj)) { + foreach(obj, function(val, name) { + obj[name] = transformDates(val); + }); + } + return obj; + } } angular['toJson'] = toJson; diff --git a/src/parser.js b/src/parser.js index a9b66c52..d233b15f 100644 --- a/src/parser.js +++ b/src/parser.js @@ -26,7 +26,7 @@ var OPERATORS = { var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'}; function lex(text, parseStringsForObjects){ - var dateParseLength = parseStringsForObjects ? 24 : -1, + var dateParseLength = parseStringsForObjects ? DATE_ISOSTRING_LN : -1, tokens = [], token, index = 0, diff --git a/src/services.js b/src/services.js index d49b5370..36c43564 100644 --- a/src/services.js +++ b/src/services.js @@ -705,7 +705,7 @@ angularServiceInject('$xhr', function($browser, $error, $log){ $browser.xhr(method, url, post, function(code, response){ try { if (isString(response) && /^\s*[\[\{]/.exec(response) && /[\}\]]\s*$/.exec(response)) { - response = fromJson(response); + response = fromJson(response, true); } if (code == 200) { callback(code, response); |
