JSON.stringify额外的引号

时间:2014-07-29 11:49:20

标签: javascript json

考虑:

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 ""

我希望他们返回同样的东西,但后来我读了

http://www.json.org/js.html

  

如果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的存在中意识到这一点。

1 个答案:

答案 0 :(得分:5)

toJSON()不是一个返回JSON的函数。相反,它是一个函数,当它存在时,在之前被称为 JSON序列化。以下是完全相同的:

JSON.stringify(new Date().toJSON()); // toJSON called manually
JSON.stringify(new Date()); // toJSON called by the serializer