2012-02-08 73 views
8
{ id: 1533, 
    story_type_id: 1, 
    content_id: 470, 
    created_at: Sun, 05 Feb 2012 07:02:43 GMT, 
    updated_at: Sun, 05 Feb 2012 07:02:43 GMT, 
    type_name: 'post' } 

我有一个类似上面的“日期时间”字段的JSON对象。这是完美的。但是,当我字符串化(我想其存储在缓存中),我得到这样的格式:为什么JSON.stringify搞砸了我的日期时间对象?

"created_at":"2012-02-05T07:02:43.000Z" 

这会导致问题,因为当我想JSON.parse这个,突然它不再日期时间格式,它是不兼容与我的其他格式。

我能做些什么来解决这个问题?我的应用程序中到处都有'created_at'乱七八糟的东西。我不想手动更改每一个。

+0

想必您将这些日期序列化以将其存储在localStorage中。在这种情况下,你可以通过使用像rhaboo这样的包装库来避免像这样或类似的仇恨。 – 2015-04-21 05:11:22

回答

13

有没有特殊的方式来序列化JSON中的对象Date。这就是为什么你得到标准化的字符串表示。您需要将它们传递回Date构造函数,将它们转换回Date对象。

item['created_at'] = new Date(item['created_at']); 

更新:随着reviver功能(见注释),你可以得到Date对象回来。

var item = JSON.parse(row, function (key, value) { 
    if (key === 'created_at') { 
    return new Date(value); 
    } else { 
    return value; 
    } 
}); 
+0

那么我无能为力? – TIMEX 2012-02-08 13:47:28

+0

不,我不这么认为。你将不得不以其他方式存储它。 – 2012-02-08 13:49:21

+0

Date对象是JavaScript本地的,但JSON是用于在平台之间传输数据的序列化机制。如果它允许本地对象和函数的序列化,则从JS向PHP传输JSON的系统将会中断。你可能想看看JSON'reviver'方法。 – JAAulde 2012-02-08 13:51:38

10

实际上可以修改Date对象如何被序列化为JSON。结合reviver函数,可以创建一个双向解决方案,它将自动处理序列化,并且可以轻松用于反序列化。

首先修改这样的序列:

Date.prototype.toJSON = function() { return "{timestamp}+" . this.getTime() } 

这将前缀改变Date对象的表示为Unix时间戳作为标记:

> json = JSON.stringify({test:new Date()}); 
"{"test":"{timestamp}1380164268633"}" 

然后你就可以创建一个reviver功能,将自动过滤掉这些值:

function json_deserialize_helper(key,value) { 
    if (typeof value === 'string') { 
    var regexp; 
    regexp = /^{timestamp}(\d*)$/.exec(value); 
    if (regexp) { 
     return new Date(+regexp[1]); 
    } 
    } 
    return value; 
} 

(Credit :此代码已基本从这个答案抄在一个相关的问题:https://stackoverflow.com/a/14509447/2572897

这种设置

现在,从之前我们的结果的反序列化将导致Date对象再次:

> JSON.parse(json, json_deserialize_helper); 
Object {test: Thu Sep 26 2013 04:57:48 GMT+0200 (CEST)} 

或者你可以选择不修改串行化而是使用正则表达式来捕捉标准序列化格式:

function json_deserialize_helper(key,value) { 
    if (typeof value === 'string') { 
    var regexp; 
    regexp = /^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ$/.exec(value); 
    if (regexp) { 
     return new Date(value); 
    } 
    } 
    return value; 
} 

实施例:

> json = JSON.stringify({test:new Date()}) 
"{"test":"2013-09-26T03:05:26.563Z"}" 
> JSON.parse(json, json_deserialize_helper) 
Object {test: Thu Sep 26 2013 05:05:26 GMT+0200 (CEST)} 
0

Date.prototype.toJSON = function(){return moment(this).format('L'); }

您可以阅读更多关于时刻文件和定制你想要返回的日期类型。