【问题标题】:Why does JSON.stringify() accept Date objects?为什么 JSON.stringify() 接受 Date 对象?
【发布时间】:2012-05-04 09:49:31
【问题描述】:

至少在 Firefox 中,您可以对 Date 对象进行字符串化:

>>> JSON.stringify({'now': new Date()})
'{"now":"2012-04-23T18:44:05.600Z"}'

这是有效的,因为(在 Firefox 中)Date 包含一个 toJSON 方法,该方法由其 JSON 序列化程序使用。但是,这不是 JSON 标准的一部分,所以我想知道为什么存在这种方法,或者更确切地说,为什么内置 JSON 序列化程序会检查这种方法。由于它不是标准化的,如果不先测试内置序列化程序是否理解它,则无论如何都不能安全地使用它,否则使用自定义序列化程序(例如json2.js

【问题讨论】:

  • 它是 ECMAScript 标准的一部分。
  • Chrome中也存在:Date.prototype.toJSON
  • 我以为它可能调用了 toString,但我试过了,你得到了不同格式的字符串。
  • @ChaosPandion:将其作为答案发布(例如,引用 ES 标准),我会接受。刚刚检查了那个文档,它确实定义了如何序列化未知对象。
  • 在将日期转换为字符串时,您当然应该使用 ISO-8601。但是,此时您要序列化的 字符串,而不是 Date 对象......并且 JSON 支持字符串就好了。

标签: javascript json date


【解决方案1】:

这是可行的,因为它是在规范中以不太明确的方式指定的。首先,您需要深入了解抽象操作 Str 的描述中的 15.12.3 部分,该操作用于将值转换为字符串表示形式。本质上,如果输入是一个对象,规范要求检查是否存在名为toJSON 的可调用值。将其视为 Java 或 C# 中的接口。

interface IAmJSON 
{
    string toJSON(string key);
}

这是规范中的确切文本。

2. 如果 Type(value) 是 Object,那么 一种。让 toJSON 成为使用参数“toJSON”调用 [[Get]] 内部值方法的结果。 湾。如果 IsCallable(toJSON) 为真 一世。令 value 为调用 toJSON 的 [[Call]] 内部方法的结果,将 value 作为 this 值传递,并带有由 key 组成的参数列表。

最后,日期对象在 15.9.5.44 部分中定义了toJSON

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-29
    • 2016-03-05
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2018-03-30
    相关资源
    最近更新 更多