aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIgor Minar2010-12-22 13:19:26 -0800
committerIgor Minar2010-12-22 14:16:36 -0800
commite7a0fb250f6cc69c93daffe0d043d073fd488c03 (patch)
treea799e9264a131a9124de7983b5655b9e97df44ba /src
parente3ddc2bcc48ba6160455c4ffe35df87715c05693 (diff)
downloadangular.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.js3
-rw-r--r--src/JSON.js28
-rw-r--r--src/parser.js2
-rw-r--r--src/services.js2
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);