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

Mik*_*ike 6 javascript json casting

对不起,如果这是一个愚蠢的问题,这是我的第一个JS项目......

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

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

Ale*_*yne 9

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

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

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

这是像backbone.js这样的方法:

new Book({
  title: "One Thousand and One Nights",
  author: "Scheherazade"
});
Run Code Online (Sandbox Code Playgroud)

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

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


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

Javascript对象没有您在其他语言中想到的"类型".Javascript对象只是键/值对的字典.当您执行类似于new SomeClass()获取新对象的操作时,它具有prototype指向函数对象prototype属性的特殊属性SomeClass.另一个对象一个SomeClass不像你乍一看的那样明确的问题.

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

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

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