【问题标题】:Javascript: how to un-jsonify efficiently/correctlyJavascript:如何有效/正确地取消 jsonify
【发布时间】:2012-08-06 05:31:51
【问题描述】:

说实话,我不太确定从哪里开始回答这个问题。 我将描述一下情况:我正在为 HTML5 游戏制作关卡编辑器。关卡编辑器已经可以使用 - 现在我想保存/加载使用此编辑器创建的关卡。

由于这一切都是在 Javascript 中完成的(关卡编辑器和游戏),我正在考虑让保存简单地将关卡转换为 JSON 并加载,嗯...取消 jsonify。

问题是 - 关卡包含几种类型的对象(几种不同类型的实体,几种类型的动画对象等......)现在,每次我想向游戏中添加一个对象时,我都必须编写专门针对该对象的 unjsonify 方法,然后修改关卡对象的 unjsonify 方法,以便它可以处理新定义的对象类型的 unjsonifying。

我不能简单地使用 JSON.parse,因为它只会返回一个与原始对象具有相同键和值的对象,但它实际上并不是该类/原型的对象。那么,我的问题是,是否有一种正确的方法来做到这一点,而无需每次我想向游戏中添加新类型的对象时都必须不断修改代码?

【问题讨论】:

    标签: javascript json html parsing


    【解决方案1】:

    我会在您的每个对象上创建序列化/反序列化方法,以将它们的状态放入 JSON 对象并从中恢复。复合对象将递归地序列化/反序列化它们的子对象。举个例子:

    function Player {
      this.weapon = new Weapon();
    }
    
    Player.prototype.serialise = function () {
      return {'type': 'Player', weapon: this.weapon.serialise()};
    }
    
    Player.deserialise = function(json_object) {
      var player = new Player();
      player.weapon = Weapon.deserialise(json.weapon);
      return player;
    }
    

    显然,在实际代码中,您需要进行检查以确保您获得了您期望的对象类型。数组和简单的散列对象可以在序列化/反序列化期间简单地复制,尽管它们的子对象通常需要递归。

    【讨论】:

    • 谢谢!这对我有用。不过我想知道......你能想出一种在某种程度上实现自动化的方法吗?例如,将类型映射到构造函数,然后有一个使用映射的通用序列化/反序列化函数(不必为每个对象编写单独的序列化/反序列化?)
    • @Xaan 是的,我认为您可以为某些类型的对象创建一个自动序列化方法。它可以遍历对象属性并使用 hasOwnProperty 来确定需要保存哪些属性,但是您必须考虑可以在哪里应用它,因为您可能必须处理循环引用或其他问题。对于简单的对象应该没问题。
    猜你喜欢
    • 1970-01-01
    • 2015-09-22
    • 2016-04-06
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多