diff options
author | Tomeu Vizoso <tomeu@sugarlabs.org> | 2009-04-30 19:13:38 (GMT) |
---|---|---|
committer | Tomeu Vizoso <tomeu@sugarlabs.org> | 2009-04-30 19:13:38 (GMT) |
commit | 592d8e144563f3b390d7d8a7d43df67db2d05a06 (patch) | |
tree | 11928d2bdca37fe1042246cfb8f8ec5367040a13 /json.as |
Initial commit
Diffstat (limited to 'json.as')
-rw-r--r-- | json.as | 364 |
1 files changed, 364 insertions, 0 deletions
@@ -0,0 +1,364 @@ +/* +Copyright (c) 2005 JSON.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The Software shall be used for Good, not Evil. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +/* +Ported to Actionscript 2 May 2005 by Trannie Carter <tranniec@designvox.com>, +wwww.designvox.com + +Updated 2007-03-30 + +USAGE: + var json = new JSON(); + try { + var o:Object = json.parse(jsonStr); + var s:String = json.stringify(obj); + } catch(ex) { + trace(ex.name + ":" + ex.message + ":" + ex.at + ":" + ex.text); + } + +*/ + +class JSON { + var ch:String = ''; + var at:Number = 0; + var t,u; + var text:String; + + function stringify(arg):String { + + var c, i, l, s = '', v; + + switch (typeof arg) { + case 'object': + if (arg) { + if (arg instanceof Array) { + for (i = 0; i < arg.length; ++i) { + v = stringify(arg[i]); + if (s) { + s += ','; + } + s += v; + } + return '[' + s + ']'; + } else if (typeof arg.toString != 'undefined') { + for (i in arg) { + v = arg[i]; + if (typeof v != 'undefined' && typeof v != 'function') { + v = stringify(v); + if (s) { + s += ','; + } + s += stringify(i) + ':' + v; + } + } + return '{' + s + '}'; + } + } + return 'null'; + case 'number': + return isFinite(arg) ? String(arg) : 'null'; + case 'string': + l = arg.length; + s = '"'; + for (i = 0; i < l; i += 1) { + c = arg.charAt(i); + if (c >= ' ') { + if (c == '\\' || c == '"') { + s += '\\'; + } + s += c; + } else { + switch (c) { + case '\b': + s += '\\b'; + break; + case '\f': + s += '\\f'; + break; + case '\n': + s += '\\n'; + break; + case '\r': + s += '\\r'; + break; + case '\t': + s += '\\t'; + break; + default: + c = c.charCodeAt(); + s += '\\u00' + Math.floor(c / 16).toString(16) + + (c % 16).toString(16); + } + } + } + return s + '"'; + case 'boolean': + return String(arg); + default: + return 'null'; + } + } + function white() { + while (ch) { + if (ch <= ' ') { + this.next(); + } else if (ch == '/') { + switch (this.next()) { + case '/': + while (this.next() && ch != '\n' && ch != '\r') {} + break; + case '*': + this.next(); + for (;;) { + if (ch) { + if (ch == '*') { + if (this.next() == '/') { + next(); + break; + } + } else { + this.next(); + } + } else { + error("Unterminated comment"); + } + } + break; + default: + this.error("Syntax error"); + } + } else { + break; + } + } + } + + function error(m) { + throw { + name: 'JSONError', + message: m, + at: at - 1, + text: text + }; + } + function next() { + ch = text.charAt(at); + at += 1; + return ch; + } + function str() { + var i, s = '', t, u; + var outer:Boolean = false; + + if (ch == '"') { + while (this.next()) { + if (ch == '"') { + this.next(); + return s; + } else if (ch == '\\') { + switch (this.next()) { + case 'b': + s += '\b'; + break; + case 'f': + s += '\f'; + break; + case 'n': + s += '\n'; + break; + case 'r': + s += '\r'; + break; + case 't': + s += '\t'; + break; + case 'u': + u = 0; + for (i = 0; i < 4; i += 1) { + t = parseInt(this.next(), 16); + if (!isFinite(t)) { + outer = true; + break; + } + u = u * 16 + t; + } + if(outer) { + outer = false; + break; + } + s += String.fromCharCode(u); + break; + default: + s += ch; + } + } else { + s += ch; + } + } + } + this.error("Bad string"); + } + + function arr() { + var a = []; + + if (ch == '[') { + this.next(); + this.white(); + if (ch == ']') { + this.next(); + return a; + } + while (ch) { + a.push(this.value()); + this.white(); + if (ch == ']') { + this.next(); + return a; + } else if (ch != ',') { + break; + } + this.next(); + this.white(); + } + } + this.error("Bad array"); + } + + function obj() { + var k, o = {}; + + if (ch == '{') { + this.next(); + this.white(); + if (ch == '}') { + this.next(); + return o; + } + while (ch) { + k = this.str(); + this.white(); + if (ch != ':') { + break; + } + this.next(); + o[k] = this.value(); + this.white(); + if (ch == '}') { + this.next(); + return o; + } else if (ch != ',') { + break; + } + this.next(); + this.white(); + } + } + this.error("Bad object"); + } + + function num() { + var n = '', v; + + if (ch == '-') { + n = '-'; + this.next(); + } + while (ch >= '0' && ch <= '9') { + n += ch; + this.next(); + } + if (ch == '.') { + n += '.'; + this.next(); + while (ch >= '0' && ch <= '9') { + n += ch; + this.next(); + } + } + if (ch == 'e' || ch == 'E') { + n += ch; + this.next(); + if (ch == '-' || ch == '+') { + n += ch; + this.next(); + } + while (ch >= '0' && ch <= '9') { + n += ch; + this.next(); + } + } + v = Number(n); + if (!isFinite(v)) { + this.error("Bad number"); + } + return v; + } + + function word() { + switch (ch) { + case 't': + if (this.next() == 'r' && this.next() == 'u' && + this.next() == 'e') { + this.next(); + return true; + } + break; + case 'f': + if (this.next() == 'a' && this.next() == 'l' && + this.next() == 's' && this.next() == 'e') { + this.next(); + return false; + } + break; + case 'n': + if (this.next() == 'u' && this.next() == 'l' && + this.next() == 'l') { + this.next(); + return null; + } + break; + } + this.error("Syntax error"); + } + + function value() { + this.white(); + switch (ch) { + case '{': + return this.obj(); + case '[': + return this.arr(); + case '"': + return this.str(); + case '-': + return this.num(); + default: + return ch >= '0' && ch <= '9' ? this.num() : this.word(); + } + } + function parse(_text:String):Object { + text = _text; + at = 0; + ch = ' '; + return value(); + } +}
\ No newline at end of file |