[JS]toJSONString
/*
* Ext JS Library 1.1.1
* Copyright(c) 2006-2007, Ext JS, LLC.
* extjs.com
*
* http://www.extjs.com/license
*/
/**
* @class Ext.util.JSON
* Modified version of Douglas Crockford"s json.js that doesn"t
* mess with the Object prototype
* http://www.json.org/js.html
* @singleton
*/
Ext.util.JSON = new (function{
var useHasOwn = {}.hasOwnProperty ? true : false;
// crashes Safari in some instances
//var validRE = /^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/;
var pad = function(n) {
return n < 10 ? "0" + n : n;
};
var m = {
"\b": '\\b',
"\t": '\\t',
"\n": '\\n',
"\f": '\\f',
"\r": '\\r',
'"' : '\\"',
"\\": '\\\\'
};
var encodeString = function(s){
if (/["\\\x00-\x1f]/.test(s {
return '"' + s.replace(/([\x00-\x1f\\"])/g, function(a, b) {
var c = m[b];
if(c){
return c;
}
c = b.charCodeAt;
return "\\u00" +
Math.floor(c / 16).toString(16) +
(c % 16).toString(16);
}) + '"';
}
return '"' + s + '"';
};
var encodeArray = function(o){
var a = ["["], b, i, l = o.length, v;
for (i = 0; i < l; i += 1) {
v = o[i];
switch (typeof v) {
case "undefined":
case "function":
case "unknown":
break;
default:
if (b) {
a.push(',');
}
a.push(v === null ? "null" : Ext.util.JSON.encode(v;
b = true;
}
}
a.push("]");
return a.join("");
};
var encodeDate = function(o){
return '"' + o.getFullYear + "-" +
pad(o.getMonth + 1) + "-" +
pad(o.getDate + "T" +
pad(o.getHours + ":" +
pad(o.getMinutes + ":" +
pad(o.getSeconds + '"';
};
/**
* Encodes an Object, Array or other value
* @param {Mixed} o The variable to encode
* @return {String} The JSON string
*/
this.encode = function(o){
if(typeof o == "undefined" || o === null){
return "null";
}else if(o instanceof Array){
return encodeArray(o);
}else if(o instanceof Date){
return encodeDate(o);
}else if(typeof o == "string"){
return encodeString(o);
}else if(typeof o == "number"){
return isFinite(o) ? String(o) : "null";
}else if(typeof o == "boolean"){
return String(o);
}else {
var a = ["{"], b, i, v;
for (i in o) {
if(!useHasOwn || o.hasOwnProperty(i {
v = o[i];
switch (typeof v) {
case "undefined":
case "function":
case "unknown":
break;
default:
if(b){
a.push(',');
}
a.push(this.encode(i ":",
v === null ? "null" : this.encode(v;
b = true;
}
}
}
a.push("}");
return a.join("");
}
};
/**
* Decodes (parses) a JSON string to an object. If the JSON is invalid, this function throws a SyntaxError.
* @param {String} json The JSON string
* @return {Object} The resulting object
*/
this.decode = function(json){
return eval("(" + json + ')');
};
};
/**
* Shorthand for {@link Ext.util.JSON#encode}
* @member Ext encode
* @method */
Ext.encode = Ext.util.JSON.encode;
/**
* Shorthand for {@link Ext.util.JSON#decode}
* @member Ext decode
* @method */
Ext.decode = Ext.util.JSON.decode;
Тока там надо убрать ext-овый неймспейс, но это вроде легко.
На сейчас хватит, а потом так и придется переписывать, похоже.
Модифицировать код нельзя, вроде?
А зачем у них:
x = new (function {return 'test';} вместо x = new function {return 'test';} ?
PS: updated: new забыл.
А зачем у них:x = new (function {return 'test';} вместо x = new function {return 'test';} ?x = new (function {return 'test';} - это замыкание, т.е. в функцию уже подставлены параметры и она вызвана, а x = new function {return 'test';} - просто функция.
Параметров нет. Что не замкнулось во втором примере?
И там и там this.test = function{} внутри можно писать и вызывать потом снаружи. "Приватные" переменные и там и там будут и будут работать.
В данном случае разницы нет. Просто видимо автор хотел явно показать, что это замыкание.
Угу, скобочки удивили.
Оставить комментарий
pilot
Вот стандартная библиотека JSON для JS: http://www.json.org/json.jsОна портит циклы вида for(var i in obj)....
Которые я очень люблю.
Вот ссылка на блог где сие обсуждается: http://yuiblog.com/blog/2006/09/26/for-in-intrigue/
Очень хочется иметь функцию toJSONString(obj) и parseJSON(obj а не obj.toJSONString и obj.parseJSON (т.к. эта штука нужна в одном месте программы, а любимый цикл — в куче).
Где бы найти нужным образом пиленый json.js ?