【问题标题】:JSON.stringify extra quotesJSON.stringify 额外的引号
【发布时间】: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 ""

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

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 的名称和存在中意识到这一点。

【问题讨论】:

  • 我没有发现问题。在 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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多