var JSON = function(sJSON) {
this.objType = (typeof sJSON);
this.self = [];
(function(s, o) {
for (var i in o) {
o.hasOwnProperty(i) && (s[i] = o[i], s.self[i] = o[i])
};
})(this, (this.objType == 'string') ? eval('0,' + sJSON) : sJSON);
}
JSON.prototype = {
toString : function() {
return this.getString();
},
valueOf : function() {
return this.getString();
},
getString : function() {
var sA = [];
(function(o) {
var oo = null;
sA.push('{');
for (var i in o) {
if (o.hasOwnProperty(i) && i != 'prototype') {
oo = o[i];
if (oo instanceof Array) {
sA.push(i + ':[');
for (var b in oo) {
if (oo.hasOwnProperty(b) && b != 'prototype') {
sA.push(oo[b] + ',');
if (typeof oo[b] == 'object')
arguments.callee(oo[b]);
}
}
sA.push('],');
continue;
} else {
sA.push(i + ':' + oo + ',');
}
if (typeof oo == 'object')
arguments.callee(oo);
}
}
sA.push('},');
})(this.self);
return sA.slice(0).join('').replace(/\[object object\],/ig, '')
.replace(/,\}/g, '}').replace(/,\]/g, ']').slice(0, -1);
},
push : function(sName, sValue) {
this.self[sName] = sValue;
this[sName] = sValue;
}
}
测试:
var strA = '{allPrivList: [{id:"func001", desc:"商品管理"},{id:"func002", desc:"類別管理"},{id:"func003", desc:"行銷管理"}],groupList: [{id:"g001", desc:"客服", privList: ["func001", "func002", "func004"] },{id:"g002", desc:"營運", privList: ["func003"]}]}';
var objA = new JSON(strA);
alert(objA);
alert(objA.allPrivList[0].desc + '\n' + objA.groupList[0].privList + '\n'
+ objA.groupList[1].desc);
objA.push("C", [1, "hello baby", function() {
alert(this.C[1])
}]);
alert(objA);
objA.C[2].call(objA);
var objB = new JSON({});
alert(objB);
objB.push("A", function() {
alert('test A')
});
alert(objB);
objB.A();
var objC = new JSON([1]);
alert(objC);
objC.push("A", function() {
alert('test A')
});
alert(objC.A);
var xTree = new JSON({
name : 'root',
list : [{
name : '1',
list : [{
name : '1-1',
list : []
}, {
name : '1-2',
list : []
}]
}, {
name : 'look at me',
list : []
}]
});
alert(xTree);
var r = xTree.list.splice(1, 1)[0];
alert(xTree);
xTree.list[0].list.splice(1, 0, r);
alert(xTree);