diff options
Diffstat (limited to 'src/JSON.js')
| -rw-r--r-- | src/JSON.js | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/JSON.js b/src/JSON.js new file mode 100644 index 00000000..2b6393bf --- /dev/null +++ b/src/JSON.js @@ -0,0 +1,92 @@ +nglr.array = [].constructor; + +nglr.toJson = function(obj, pretty){ + var buf = []; + nglr.toJsonArray(buf, obj, pretty ? "\n " : null); + return buf.join(''); +}; + +nglr.toPrettyJson = function(obj) { + return nglr.toJson(obj, true); +}; + +nglr.fromJson = function(json) { + try { + var parser = new nglr.Parser(json, true); + var expression = parser.primary(); + parser.assertAllConsumed(); + return expression(); + } catch (e) { + console.error("fromJson error: ", json, e); + throw e; + } +}; + + +nglr.toJsonArray = function(buf, obj, pretty){ + var type = typeof obj; + if (obj === null) { + buf.push("null"); + } else if (type === 'function') { + return; + } else if (type === 'boolean') { + buf.push('' + obj); + } else if (type === 'number') { + if (isNaN(obj)) { + buf.push('null'); + } else { + buf.push('' + obj); + } + } else if (type === 'string') { + return buf.push(angular.String.quoteUnicode(obj)); + } else if (type === 'object') { + if (obj instanceof Array) { + 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 (typeof item == 'function' || typeof item == 'undefined') { + buf.push("null"); + } else { + nglr.toJsonArray(buf, item, pretty); + } + sep = true; + } + buf.push("]"); + } else if (obj instanceof Date) { + buf.push(angular.String.quoteUnicode(angular.Date.toString(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.indexOf('$$') === 0) + continue; + keys.push(k); + } + keys.sort(); + for ( var keyIndex = 0; keyIndex < keys.length; keyIndex++) { + var key = keys[keyIndex]; + try { + var value = obj[key]; + if (typeof value != 'function') { + if (comma) { + buf.push(","); + if (pretty) buf.push(pretty); + } + buf.push(angular.String.quote(key)); + buf.push(":"); + nglr.toJsonArray(buf, value, childPretty); + comma = true; + } + } catch (e) { + } + } + buf.push("}"); + } + } +}; |
