【问题标题】:How come JSON can't save object's functions?为什么 JSON 不能保存对象的函数?
【发布时间】:2011-12-18 20:23:49
【问题描述】:

在我的游戏中,我通过将所有对象转换为 JSON 并将其保存到文件来保存当前状态。有些对象,比如敌人,上面有函数,但是 JSON 不能保存函数!是否有替代方案或解决方案?

【问题讨论】:

  • 因为json反序列化了数据
  • 您的函数是特定于实例还是特定于“类”?
  • 函数的作用域在序列化和反序列化时会发生什么?函数不仅仅是作为字符串表示的代码。
  • @sissonb 失败。 .data 完全无关/无用。
  • 为什么要序列化函数?这不是安全风险吗(有人可以破解序列化函数以放入任意代码。

标签: javascript json node.js


【解决方案1】:
var Enemy = {
  toJSON: function () {
    // pack it up
  },
  fromJSON: function (json) {
    // unpack it.
  },
  /* methods */
};

var e = Object.create(Enemy);
var json = JSON.stringify(e);
var same_e = Enemy.fromJSON(json);

.toJSON 方法是JSON.stringify 的标准接口,它会查看该方法并调用它,如果它存在,它会将返回的对象字符串化。

.fromJSON 方法只是您的 Enemy 对象的命名构造函数。

具体例子 JSfiddle

var Enemy = {
  constructor: function(name, health) {
    this.health = health || 100;
    this.name = name;
  },
  shootThing: function (thing) { },
  move: function (x,y) { },
  hideBehindCover: function () {},
  toJSON: function () { 
    return {
      name: this.name,
      health: this.health
    };
  },
  fromJSON: function (json) {
    var data = JSON.parse(json);
    var e = Object.create(Enemy);
    e.health = data.health;
    e.name = data.name;
    return e;
  }
}

var e = Object.create(Enemy);
e.constructor("bob");
var json = JSON.stringify(e);
var e2 = Enemy.fromJSON(json);
console.log(e.name === e2.name);

元选项:

元选项是将类名写入对象

Game.Enemy = {
  ...
  class: "Enemy"
};

然后,当您加载所有 json 数据时,您只需这样做

var instance = Game[json.class].fromJSON(json);

【讨论】:

  • 所以基本上每次游戏开始时我都必须创建新的敌人实例?哦,好吧,还有一点工作,但没关系......
  • @bane 新实例很便宜。如果你愿意,你可以元化它。
  • @Raynos 如果敌人在对象树的深处,这将不起作用,对吧?
  • @thejh 你是什么意思?如果 JSON 对象代表包含敌人数组的游戏?是的,那么您将有一个 Game.fromJSON 方法来完全解压缩该 json 对象
  • 您能否提供一个参考链接,这是标准的,好吗?
【解决方案2】:

我认为您必须将类型保存在对象上,以便可以在解析时重新添加函数。例如。在构造函数中为你的敌人添加一个type 属性。在解析时,首先像普通 JSON 一样解析字符串,然后深度遍历生成的对象。当您遇到 Enemy 时,请重新附加方法左右。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2015-09-19
    • 1970-01-01
    • 2012-02-28
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多