Login   Register  
PHP Classes
elePHPant
Icontem

File: json2.js

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Jo Giraerts  >  cjEvents  >  json2.js  >  Download  
File: json2.js
Role: Auxiliary data
Content type: text/plain
Description: json js lib
Class: cjEvents
Handle browser events in PHP
Author: By
Last change:
Date: 2010-08-25 02:12
Size: 5,318 bytes
 

Contents

Class file image Download
/*
JSONstring v 1.02
copyright 2006-2010 Thomas Frank
(Small sanitizer added to the toObject-method, May 2008)
(Scrungus fix to some problems with quotes in strings added in July 2010)

This EULA grants you the following rights:

Installation and Use. You may install and use an unlimited number of copies of the SOFTWARE PRODUCT.

Reproduction and Distribution. You may reproduce and distribute an unlimited number of copies of the SOFTWARE PRODUCT either in whole or in part; each copy should include all copyright and trademark notices, and shall be accompanied by a copy of this EULA. Copies of the SOFTWARE PRODUCT may be distributed as a standalone product or included with your own product.

Commercial Use. You may sell for profit and freely distribute scripts and/or compiled scripts that were created with the SOFTWARE PRODUCT.

Based on Steve Yen's implementation:
http://trimpath.com/project/wiki/JsonLibrary

Sanitizer regExp:
Andrea Giammarchi 2007

*/

JSONstring={
    compactOutput:false,        
    includeProtos:false,    
    includeFunctions: false,
    detectCirculars:true,
    restoreCirculars:true,
    make:function(arg,restore) {
        this.restore=restore;
        this.mem=[];this.pathMem=[];
        return this.toJsonStringArray(arg).join('');
    },
    toObject:function(x){
        if(!this.cleaner){
            try{this.cleaner=new RegExp('^("(\\\\.|[^"\\\\\\n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$')}
            catch(a){this.cleaner=/^(true|false|null|\[.*\]|\{.*\}|".*"|\d+|\d+\.\d+)$/}
        };
        if(!this.cleaner.test(x)){return {}};
        eval("this.myObj="+x);
        if(!this.restoreCirculars || !alert){return this.myObj};
        if(this.includeFunctions){
            var x=this.myObj;
            for(var i in x){if(typeof x[i]=="string" && !x[i].indexOf("JSONincludedFunc:")){
                x[i]=x[i].substring(17);
                eval("x[i]="+x[i])
            }}
        };
        this.restoreCode=[];
        this.make(this.myObj,true);
        var r=this.restoreCode.join(";")+";";
        eval('r=r.replace(/\\W([0-9]{1,})(\\W)/g,"[$1]$2").replace(/\\.\\;/g,";")');
        eval(r);
        return this.myObj
    },
    toJsonStringArray:function(arg, out) {
        if(!out){this.path=[]};
        out = out || [];
        var u; // undefined
        switch (typeof arg) {
        case 'object':
            this.lastObj=arg;
            if(this.detectCirculars){
                var m=this.mem; var n=this.pathMem;
                for(var i=0;i<m.length;i++){
                    if(arg===m[i]){
                        out.push('"JSONcircRef:'+n[i]+'"');return out
                    }
                };
                m.push(arg); n.push(this.path.join("."));
            };
            if (arg) {
                if (arg.constructor == Array) {
                    out.push('[');
                    for (var i = 0; i < arg.length; ++i) {
                        this.path.push(i);
                        if (i > 0)
                            out.push(',\n');
                        this.toJsonStringArray(arg[i], out);
                        this.path.pop();
                    }
                    out.push(']');
                    return out;
                } else if (typeof arg.toString != 'undefined') {
                    out.push('{');
                    var first = true;
                    for (var i in arg) {
                        if(!this.includeProtos && arg[i]===arg.constructor.prototype[i]){continue};
                        this.path.push(i);
                        var curr = out.length; 
                        if (!first)
                            out.push(this.compactOutput?',':',\n');
                        this.toJsonStringArray(i, out);
                        out.push(':');                    
                        this.toJsonStringArray(arg[i], out);
                        if (out[out.length - 1] == u)
                            out.splice(curr, out.length - curr);
                        else
                            first = false;
                        this.path.pop();
                    }
                    out.push('}');
                    return out;
                }
                return out;
            }
            out.push('null');
            return out;
        case 'unknown':
        case 'undefined':
        case 'function':
            if(!this.includeFunctions){out.push(u);return out};
            arg="JSONincludedFunc:"+arg;
            out.push('"');
            var a=['\\','\\\\','\n','\\n','\r','\\r','"','\\"'];arg+=""; 
            for(var i=0;i<8;i+=2){arg=arg.split(a[i]).join(a[i+1])};
            out.push(arg);
            out.push('"');
            return out;
        case 'string':
            if(this.restore && arg.indexOf("JSONcircRef:")==0){
                this.restoreCode.push('this.myObj.'+this.path.join(".")+"="+arg.split("JSONcircRef:").join("this.myObj."));
            };
            out.push('"');
            var a=['\n','\\n','\r','\\r','"','\\"'];
            arg+=""; for(var i=0;i<6;i+=2){arg=arg.split(a[i]).join(a[i+1])};
            out.push(arg);
            out.push('"');
            return out;
        default:
            out.push(String(arg));
            return out;
        }
    }
};