当前位置: 首页 > 面试题库 >

如何将继承的对象字符串化为JSON?

鲜于意
2023-03-14
问题内容

使用JSON.stringify()时,json2.js似乎忽略了父对象的成员。例:

require('./json2.js');

function WorldObject(type) {    
    this.position = 4;
}

function Actor(val) {
    this.someVal = 50;
}

Actor.prototype = new WorldObject();

var a = new Actor(2);

console.log(a.position);
console.log(JSON.stringify(a));

输出为:

4
{"someVal":50}

我期望这个输出:

4
{"position":0, "someVal":50}

问题答案:

好吧,就是这样,JSON.stringify它不会保留该对象的任何非拥有属性。您可以在此处查看有关其他缺陷和可能的解决方法的有趣讨论。

还要注意,作者不仅记录了问题,而且编写了一个名为HydrateJS的库,它可能会对您有所帮助。

这个问题比乍一看要深一些。即使a真正地字符串化为{"position":0, "someVal":50},然后对其进行解析也会创建一个具有所需属性的对象,但该对象既不是Actor的实例,也不是指向WorldObject的原型链接(毕竟,parse方法没有这个功能)信息,因此它不可能以这种方式还原它)。

为了保留原型链,需要一些巧妙的技巧(例如HydrateJS中使用的技巧)。如果这不是您要的目标,则可能只需在对对象进行字符串化之前对其进行“展平”。为此,例如,您可以迭代对象的所有属性,而不管它们是否是拥有的,然后重新分配它们(这将确保它们在对象本身上定义,而不仅仅是从html" target="_blank">原型继承)。

function flatten(obj) {
    var result = Object.create(obj);
    for(var key in result) {
        result[key] = result[key];
    }
    return result;
}

函数的编写方式不会突变原始对象。所以用

console.log(JSON.stringify(flatten(a)));

您将获得所需的输出,并且a将保持不变。



 类似资料:
  • 问题内容: 我能够将一个对象序列化为一个文件,然后再次还原它,如下面的代码片段所示。我想将对象序列化为字符串并存储到数据库中。谁能帮我? 问题答案: 你应该使用BLOB。使用JDBC非常简单。 你发布的第二个代码的问题是编码。你还应该对字节进行编码,以确保它们均不会失败。 如果你仍然想将其记录为字符串,则可以使用java.util.Base64对字节进行编码。 仍然应该将CLOB用作数据类型,因为

  • 问题内容: 如何将上述字符串反序列化为java对象。 我正在使用的类是 问题答案: @基达 我假设您可以控制JSON输入字符串的创建方式。我认为JSON字符串格式不正确,无法对地图类型进行默认的GSON反序列化。 我已经修改了输入字符串供您考虑,这将导致非null的LocalLocationId 如果我对输入字符串的假设不正确,请发表评论。 编辑1:由于无法修改输入,请考虑编写自定义解串器。以下是

  • 我尝试从一个用于存储Spring会话的Redis服务器反序列化String到Java对象,并且我想在Spring框架之外反序列化它。我认为Spring Redis序列化器可能使用默认字符集UTF-8来将Java对象序列化为字符串。 Redis中的字符串: 错误消息: 我知道用UTF-8在Byte[]和String之间的转换很可能是问题所在,但我还是想问一下,是否有人知道如何在不修改序列化部分的情况

  • 问题内容: 我有这个JavaScript原型: 然后创建一个新对象: 如果我做: 结果是: 但我需要将对象的类型包含在JSON字符串中,如下所示: 有没有使用框架之类的方法来执行此操作的快速方法?还是我需要在类中实现一个方法并手动执行? 问题答案: 编辑: 将字符串化 所有类的 “属性”。如果只想保留其中一些,则可以这样分别指定:

  • 我在一个JSON文件中记录一些东西,我有一个datetime对象,我把它转换成一个字符串,这样我就可以在JSON中记录它(它不接受datetime对象)。 我的问题是如何将datetime字符串转换回datetime对象。我知道strptime,我只是不知道什么格式会使它与其他datetime.now对象兼容。 每当我尝试使用strtime时,我都会使用格式,并出现以下错误: 那么,默认datet

  • 面向对象编程很重要的一个方面,就是对象的继承。A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法。这对于代码的复用是非常有用的。 大部分面向对象的编程语言,都是通过“类”(class)实现对象的继承。传统上,JavaScript 语言的继承不通过 class,而是通过“原型对象”(prototype)实现,本章介绍 JavaScript 的原型链继承。 ES6 引入了 class