很抱歉,如果这是一个愚蠢的问题,这是我的第一个JS项目......
我正在尝试使用JSON反序列化JS中的自定义对象。问题是,JSON.parse()不会将对象作为其原始类型返回。由于直接将返回的对象强制转换为所需的类型似乎不可能,因此留下了'reviver'选项......
我在这里遗漏了什么吗?是不是要避免必须编写自定义方法来序列化和反序列化对象?如果我必须编写自己的方法'复活'我的对象,那么使用JSON有什么意义呢?
答案 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外部的位置。