我试图反序列化一个在其中有一个
javascript日期的json对象.当对象上调用
JSON.stringify时,日期将被序列化为未正确反序列化的字符串.我试图使用chrome,IE和FF的本机浏览器实现并使用jquery来反序列化对象.两者都给出了一些结果.这是代码段:
var obj = {Date: new Date()};
var objSer = JSON.stringify(obj);
var objDeser = JSON.parse(objSer);
var objJqDeser = $.parseJSON(objSer);
function getYear(value){
try{
return value.getYear();
}
catch(err){
return err;
}
}
$("#orig").text("Orig Year: " + getYear(obj.Date));
$("#deser").text("Deser Year: " + getYear(objDeser.Date));
$("#jqDeser").text("JqDeser Year: " + getYear(objJqDeser.Date));
我想要objDeser.Date成为一个js日期不是一个字符串.您可以在此处看到此问题:http://jsbin.com/unijud/24/edit.是否有任何js库可以正确反序列化构建JavaScript对象的日期?
解决方法
我采取了@LastCoder的建议,并写了一个简单的实现.它似乎在做我想要的.
var jsonDates = {
dtrx2: /\d{4}-\d{2}-\d{2}/,parse: function(obj){
var parsedobj = JSON.parse(obj);
return this.parseDates(parsedobj);
},parseDates: function(obj){
// iterate properties
for(pName in obj){
// make sure the property is 'truthy'
if (obj[pName]){
var value = obj[pName];
// determine if the property is an array
if (Array.isArray(value)){
for(var ii = 0; ii < value.length; ii++){
this.parseDates(value[ii]);
}
}
// determine if the property is an object
else if (typeof(value) == "object"){
this.parseDates(value);
}
// determine if the property is a string containing a date
else if (typeof(value) == "string" && this.dtrx2.test(value)){
// parse and replace
obj[pName] = new Date(obj[pName]);
}
}
}
return obj;
}
};
jsbin可提供现场示例.gist提供了参考.