Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON.stringify和JSON.parse不';不能使用日期对象_Javascript_Json - Fatal编程技术网

Javascript JSON.stringify和JSON.parse不';不能使用日期对象

Javascript JSON.stringify和JSON.parse不';不能使用日期对象,javascript,json,Javascript,Json,这在谷歌Chrome中发生: var obj = {"date" : new Date()}; var objJSON = JSON.stringify(obj); //"{"date":"2014-04-30T07:35:29.002Z"}" var objBack = JSON.parse(objJSON); objBack不是日期对象,而是字符串。我需要做: objBack.date = new Date(objBack.date) 有没有办法直接返回日期对象 我需要它,因为我有一个

这在谷歌Chrome中发生:

var obj  = {"date" : new Date()};
var objJSON = JSON.stringify(obj);
//"{"date":"2014-04-30T07:35:29.002Z"}"
var objBack = JSON.parse(objJSON);
objBack不是日期对象,而是字符串。我需要做:

objBack.date = new Date(objBack.date)
有没有办法直接返回日期对象


我需要它,因为我有一个复杂的对象(其中有很多日期),它使用JSON.stringify存储在localStorage中,在我使用JSON.parse从localStorage获取该对象之后,因此,最好将日期作为日期对象而不是字符串。

UPD:答案更一般,如果
Date
,不要覆盖默认的
toJSON
方法


如果存在对象的JSON方法,则调用该方法。所以您可以将toJSON方法添加到Date原型中

具有第二个参数函数,该函数为每个解析的值调用,可用于为某些值调用
新日期

下面是它们如何工作的一个小例子:

Date.prototype.toJSON = function() {
    return 'date:' + (+this);
}

var obj = {
    date: new Date,
    s: 'string',
    n: 42
};

console.log(obj);

var json = JSON.stringify(obj);

console.log(json);

function revive(k, v) {
    if (typeof v == 'string' && v.indexOf('date:') == 0) {
        return new Date(+(v.slice(5)));
    }
    return v;
}

var objBack = JSON.parse(json, revive);

console.log(objBack);
结果是:

~$ node a.js
{ date: Wed Apr 30 2014 12:09:11 GMT+0400 (MSK),
  s: 'string',
  n: 42 }
{"date":"date:1398845351567","s":"string","n":42}
{ date: Wed Apr 30 2014 12:09:11 GMT+0400 (MSK),
  s: 'string',
  n: 42 }

据我所知,没有其他办法,你必须这样做objBack.date=新日期(objBack.date)可能重复@RajeshCP你知道为什么吗?我想如果谷歌这么做,他们是有原因的…@alasarr:你怎么会认为谷歌与JSON有任何关系?你是对的,谷歌与JSON有任何关系,这是我的第一个想法,因为谷歌有谷歌Chrome,但emacscript规范不是谷歌的责任。不管怎样,我想不管是谁干的都有原因。。。为什么?如果存在,不要覆盖
Date.prototype.toJSON
;如果你做了填隙,用一些东西填隙。它是有效的,但是@T.J.Crowder是对的,我们应该根据spec@T.J.Crowder@alasar,你说得对。毕竟,我更喜欢使用
stringify
的第二个参数,因为这对我来说更容易。