JSON.parse,JS类型转换和启动

时间:2011-08-13 00:48:22

标签: javascript json casting

很抱歉,如果这是一个愚蠢的问题,这是我的第一个JS项目......

我正在尝试使用JSON反序列化JS中的自定义对象。问题是,JSON.parse()不会将对象作为其原始类型返回。由于直接将返回的对象强制转换为所需的类型似乎不可能,因此留下了'reviver'选项......

我在这里遗漏了什么吗?是不是要避免必须编写自定义方法来序列化和反序列化对象?如果我必须编写自己的方法'复活'我的对象,那么使用JSON有什么意义呢?

1 个答案:

答案 0 :(得分:9)

JSON是原始数据的格式。这很原始。它支持字典(aka .javascript对象,哈希,关联数组),数组,字符串,数字,布尔值和null。而已。它没有做更多的原因是这些原语与语言无关,几乎所有的编程语言都内置了处理这些类型数据的工具。

如果你有其他符号如“class”那么它突然变得非常束缚于特定的语言或代码库,并失去它的广泛和通用的适用性。

因此,将JSON视为简单的原始数据。 JSON 不是实例编组或完整对象序列化。所以,如果您打算序列化从构造函数实例化的JS对象,则需要编写“revivers”。

这是方法things like backbone.js take

new Book({
  title: "One Thousand and One Nights",
  author: "Scheherazade"
});

您只需将您的普通数据对象(JSON.parse()的结果)传递给您选择的构造函数。从那里你可以做任何事情来将它的值读入你的新对象。

例如,Javascript没有像Marhsal.dump(obj)那样在ruby中编组整个对象的标准方法。


编辑:最后一个要点......

Javascript对象没有您在其他语言中想到的“类型”。 Javascript对象只是键/值对的字典。当您执行new SomeClass()之类的操作时,您将获得一个新对象,该对象具有一个特殊的prototype属性,该属性指向prototype函数对象的SomeClass属性。另一个对象 SomeClass的一个实例不像你初看起来那么明确。

相反,您可能会问“我的构造函数对象是什么?”或“我的原型链中有哪些对象?”

因此,如果您想在JSON中传送“type”(存储为字符串),那么您将如何存储对原型对象的引用?也许原型对象根本没有在全局范围内命名,只能通过闭包获得?然后当你把它写成字符串时,你根本无法再引用那个原型对象。

重点是javascripts对象实例化的原型方法,结合它基于闭包的词法范围以及对象保持其值更像C指针而不是文字值的事实,使得完全非常难>将对象序列化到VM外部的位置。