天巨郁闷,js处理数据时,定义了一个数组,然后数组下存储的是自定义对象,然后在将数组存储到LocalStorage里的时候,由于HTML5的LocalStorage只能存储字符串,所以,,要将其序列化然后还要能读出来,然后,郁闷的事发生了。。。
也许是我的见识不够吧,愣是找不到一个内置的保险的转换方法。虽说Array对象有toString和toSource,但令我郁闷的是,在对Array用toSource的时候得到的是序列化的Object,而并没有将Object序列化为json。汗。。直接对Object用?没这个方法的,愣是没找到将自定义Object直接序列化为json的方法,孤陋寡闻了阿。
没办法,最后只得自己网上找一个序列化的函数,然后遍历数据最后拼接了,郁闷归郁闷,不过也算是解决问题了,,不知道有没有高手有更好的方法?
下面贴一个函数,以免以后用的时候找不到,不管怎么说,这东西以后应该会常用到的:
function _ToJSON(o){
if(o == null)
return “null”;switch(o.constructor) {
case String:
var s = o; // .encodeURI();
if(s.indexOf(“}”)<0)s = ‘”‘ + s.replace(/(["\\])/g, ‘\\$1′) + ‘”‘;
s = s.replace(/\n/g,”\\n”);
s = s.replace(/\r/g,”\\r”);
return s;
case Array:
var v = [];
for(var i=0; i<o.length; i++)
v.push(_ToJSON(o[i])) ;
if(v.length<=0)return “\”\”";
return “” + v.join(“,”) + “”;
case Number:
return isFinite(o) ? o.toString() : _ToJSON(null);
case Boolean:
return o.toString();
case Date:
var d = new Object();
d.__type = “System.DateTime”;
d.Year = o.getUTCFullYear();
d.Month = o.getUTCMonth() +1;
d.Day = o.getUTCDate();
d.Hour = o.getUTCHours();
d.Minute = o.getUTCMinutes();
d.Second = o.getUTCSeconds();
d.Millisecond = o.getUTCMilliseconds();
d.TimezoneOffset = o.getTimezoneOffset();
return _ToJSON(d);
default:
if(o["toJSON"] != null && typeof o["toJSON"] == “function”)
return o.toJSON();
if(typeof o == “object”) {
var v=[];
for(attr in o) {
if(typeof o[attr] != “function”)
v.push(‘”‘ + attr + ‘”: ‘ + _ToJSON(o[attr]));
}if(v.length>0)
return “{” + v.join(“,”) + “}”;
else
return “{}”;
}
alert(o.toString());
return o.toString();
}
};