为什么JSON.parse()无法解析date.toJSON()创建的内容?

时间:2012-05-03 22:40:03

标签: javascript json

使用chrome Canary

进行测试

我可以将日期转换为JSON:

> (new Date()).toJSON()
  "2012-05-03T22:27:30.530Z"

我可以将它转换回日期:

> typeof (new Date("2012-05-03T22:27:30.530Z"))
  object

为什么我不能使用JSON.parse()将其解析为Date? JSON.parse返回一个字符串,而不是Date:

> JSON.parse('{"DateValue":"2012-05-03T22:27:30.530Z"}').DateValue
 "2012-05-03T22:27:30.530Z"

3 个答案:

答案 0 :(得分:8)

因为Date不是JSON中的有效类型。 JSON只知道字符串,数字,布尔值,数组和通用对象(关联数组/散列/地图/字典/挑选你喜欢的名字)。当你将其他任何内容转换为JSON时,你会得到上面的一个 - 这意味着如果你想要将“其他东西”作为它开始的类型退出,接收者必须做一些额外的工作来重新创建它。

有一些JSON库可以抽象出来,并且包含一个额外的属性来指示什么类是什么,所以如果接收者使用相同的库,他们将获得该类型,但这仍然是相同的工作,只是隐藏由图书馆。

答案 1 :(得分:3)

因为在JSON中,日期一个字符串,就像new Date("2012-05-03T22:27:30.530Z")解析一个字符串一样。您希望JavaScript知道JSON中的字符串是日期。

您需要将JSON解析后的字符串传递给日期对象以获取日期:

var date = new Date(JSON.parse('{"DateValue":"2012-05-03T22:27:30.530Z"}').DateValue);

答案 2 :(得分:0)

.toJSON方法只返回可以用JSON表示的值。然而,JSON不了解数据类型,也不可能将对象实例信息(如原型)存储在JSON字符串中。

因此,Date的toJSON方法可以返回一个数字(例如Unix时间戳),一个具有表示年,月,日等属性的普通对象(不太好,因为不能用Date构造函数解析)或 - 会发生什么是 - 一个字符串,在这里是ISO时间格式。有了它,您可以使用new Date(JSON.parse(stringified_date))创建一个新的Date对象。

如果你delete Date.prototype.toJSON;JSON.stringify(new Date)会产生"{}"