4

使用 chrome Canary 测试

我可以将日期转换为 JSON:

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

我可以将其转换回日期:

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

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

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

3 回答 3

8

因为 Date 不是 JSON 中的有效类型。JSON 只知道字符串、数字、布尔值、数组和通用对象(关联数组/哈希/映射/字典/pick-your-favorite-name)。当您将其他任何内容转换为 JSON 时,您会得到上述之一 - 这意味着如果您想将“其他内容”恢复为它开始时的类型,接收者必须做一些额外的工作来重新创建它。

有一些 JSON 库可以抽象出来,并包含一个额外的属性来指示某物是什么类,所以如果接收者使用相同的库,他们将恢复该类型,但这仍然是相同的工作,只是被库隐藏了.

于 2012-05-03T22:45:08.837 回答
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);
于 2012-05-03T22:42:16.873 回答
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)将导致"{}".

于 2012-05-03T22:52:51.627 回答