以跟帖形式翻译吧,最后放在一起就可以了。
- /*
- 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 May 2005 by Trannie Carter , wwww.designvox.com
- USAGE:
- try {
- var o:Object = JSON.parse(jsonStr);
- var s:String = JSON.stringify(obj);
- } catch(ex) {
- trace(ex.name + ":" + ex.message + ":" + ex.at + ":" + ex.text);
- }
- */
- package {
- class JSON {
- static 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';
- }
- }
- static function parse(text:String):Object {
- var at=0;
- var ch=' ';
- function error(m) {
- throw {name:'JSONError',message:m,at:at - 1,text:text};
- }
- function next() {
- ch=text.charAt(at);
- at+= 1;
- return ch;
- }
- 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 string() {
- 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 array() {
- 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 object() {
- var k,o={};
- if (ch == '{') {
- this.next();
- this.white();
- if (ch == '}') {
- this.next();
- return o;
- }
- while (ch) {
- k=this.string();
- 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 number() {
- var n='',v;
- if (ch == '-') {
- n='-';
- this.next();
- }
- while (ch >= '0' && ch <= '9') {
- n+= ch;
- this.next();
- }
- if (ch == '.') {
- n+= '.';
- while (this.next() && ch >= '0' && ch <= '9') {
- n+= ch;
- }
- }
- v=+ n;
- if (! isFinite(v)) {
- this.error("Bad number");
- } else {
- 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.object();
- case '[' :
- return this.array();
- case '"' :
- return this.string();
- case '-' :
- return this.number();
- default :
- return ch >= '0' && ch <= '9'?this.number():this.word();
- }
- }
- return value();
- }
- }
- }
复制代码 |