JSON解析不等于原始[重复]

Posted

技术标签:

【中文标题】JSON解析不等于原始[重复]【英文标题】:JSON parsed not equal to original [duplicate] 【发布时间】:2013-09-16 00:31:49 【问题描述】:

问题是以下内容在逻辑上对我来说毫无意义,也许任何人都可以解释(解释 JSON.parse/JSON.stringify 究竟做了什么也将不胜感激):

var hello = norsk: "hei", parsedHello = JSON.parse(JSON.stringify(hello));
hello === parsedHello // false
hello == parsedHello // false
typeof(hello) // "object"
typeof(parsedHello) // "object"
hello.norsk === parsedHello.norsk // true

【问题讨论】:

***.com/questions/1068834/… 【参考方案1】:

您有两个独立的对象,它们恰好包含相同的属性/数据。它们不相等,因为它们不是同一个对象。

同理:

var a = norsk: "hei";
var b = norsk: "hei";

a == b; // false

http://jsfiddle.net/AMHbM/

【讨论】:

【参考方案2】:

JS 中的对象通过引用进行比较,因为您正在创建全新的对象 - 它们不会相等。

可以通过对它们进行字符串化来比较它们:

JSON.stringify(hello) === JSON.stringify(parsedHello)

【讨论】:

这在这种情况下会起作用,但通常要小心使用这种方法。如果字符串中的属性乱序,即使对象具有完全相同的属性和值,这两个字符串也不会相等。 @JamesMontagne 同意,这里的例子只是为了展示字符串和对象比较的差异。【参考方案3】:

javascript 中的两个对象不相等。我推荐使用underscore 的isEqual 方法来比较对象。您可以在 Underscore 的 GitHub repo https://github.com/jashkenas/underscore/blob/master/underscore.js 中找到它,并且仅在您不需要此库中的任何其他内容时才使用此特定方法。

【讨论】:

【参考方案4】:

helloparsedHello 指向两个独立的对象。您正在比较参考资料,因此这些参考资料不相等。带有对象的===== 不会执行“深度等于”;它只比较引用。

有关比较 JavaScript 对象的更多信息,请参阅 here。

【讨论】:

【参考方案5】:

这里的困惑是您正在比较两个对象是否相等,但即使它们表示的数据相同,它们也是不同的实例。

比较属性norsk 可以得到预期的结果,因为它引用了一个字符串,而JavaScript 会根据它们的值来比较字符串,在这种情况下它们是相同的。

不幸的是,以您在上面想要的方式比较复杂对象是一个复杂的事情,称为structural equality,并且没有简单的方法可以开箱即用。

【讨论】:

以上是关于JSON解析不等于原始[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥无法解析 Json 并显示原始结果?

在 iOS 中解析 JSON [重复]

JSON 字符串上的 JSON 解析抛出“无法将对象转换为原始值”

从 JSON 文件读取和解析原始数据

如何使用 Jackson 解析 JSON 数组项中的原始值?

如何从 API 解析 JSON [重复]