【发布时间】:2014-07-29 11:49:19
【问题描述】:
考虑:
var d = new Date();
var j = d.toJSON();
var s = JSON.stringify(d);
console.log 为每个变量返回:
Tue Jul 29 2014 13:27:19 GMT+0200 (W. Europe Summer Time)
2014-07-29T11:27:19.253Z // a string
"2014-07-29T11:27:19.253Z" // same string as above but packed in ""
我希望他们返回相同的东西,但后来我读到了
如果 stringify 方法看到一个包含 toJSON 方法的对象, 它调用该方法,并将返回的值字符串化。这允许 一个对象来确定它自己的 JSON 表示。
和https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify:
如果一个被字符串化的对象有一个名为 toJSON 的属性,它的值 是一个函数,那么 toJSON 方法自定义 JSON 字符串化 行为:不是被序列化的对象,而是返回的值 通过 toJSON 方法调用时将被序列化。例如:
这是否意味着我总是必须做类似的事情:
var d = new Date();
var j = d.toJSON();
var s;
if (d.toJSON) {
s = d.toJSON();
} else {
s = JSON.stringify(d);
}
确保 s == j,因为我不能依赖 JSON.stringify 不执行两个序列化?
编辑
根据 jgillich 的回答,以下代码有助于澄清事情(至少对我而言):
var s = "xxx"
s = JSON.stringify(s)
s = JSON.stringify(s)
s = JSON.stringify(s)
s = JSON.stringify(s)
s = JSON.stringify(s)
console.log(s)
返回:
""\"\\\"\\\\\\\"\\\\\\\\\\\\\\\"xxx\\\\\\\\\\\\\\\"\\\\\\\"\\\"\"""
即JSON.stringify 返回的不是字符串表示,而是对象的序列化。你会认为我会从 toString 的名称和存在中意识到这一点。
【问题讨论】:
-
我没有发现问题。在 JSON 中,字符串用引号括起来。如果您尝试在不带引号的情况下解析
2014-07-29T11:27:19.253Z,则会出现错误。 -
问题是:"2014-07-29T11:27:19.253Z" != ""2014-07-29T11:27:19.253Z""
-
JSON 不应该等于原始数据。您必须致电
JSON.parse()撤消JSON.stringify()。 -
@MattJacobsen
2014-07-29T11:27:19.253Z只是一个字符串;"2014-07-29T11:27:19.253Z"是包含字符串的 JSON (=string)。 -
@jgillich 我期待类似于在字符串上调用 toString 的行为,即直接返回对象,因为它已经是一个字符串,而不是在它周围加上更多的引号。您的回答和这些 cmets 为我澄清了一些事情:toJSON 并不意味着被视为 toString 的另一个名称;-)
标签: javascript json