我正在尝试反序列化具有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。在构建javascript对象时,是否有任何js库可以正确反序列化日期?
我接受@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上有参考资料。