反序列化的JavaScript对象实例(Deserializing JavaScript objec

2019-07-29 04:20发布

我的工作是大量使用JavaScript的应用程序。 我试图包括一些面向对象的做法。 在这种尝试中,我创建了一个基本的类像这样的:

function Item() { this.init(); }
Item.prototype = {
  init: function () {
    this.data = {
      id: 0,
      name: "",
      description: ""     
    }
  },

  save: function() {
    alert("Saving...");
    $.ajax({
      url: getUrl(),
      type: "POST",
      data: JSON.stringify(this.data),
      contentType: "application/json"
    });
  }
}

我在我的应用程序创建项目实例,然后将它们保存到像这样的本地存储:

Item item = new Item();
window.localStorage.setItem("itemKey", JSON.stringify(item));

在另一页,或在其他时间,我retriving从像这样的本地存储该项目:

var item = window.localStorage.getItem("itemKey");
item = JSON.parse(item);
item.save();

不幸的是,“保存”功能似乎并没有得到达。 在控制台窗口中,有一个错误,指出:

* save_Click(匿名函数)的onclick *

我有一种预感,在“(匿名函数)”是说的控制台窗口的方式“呼吁item.save(),但项目是一个匿名类型,所以我试图访问一个匿名函数”。 我的问题是,我不知道如何“VAR项目”再次转换成项目类的实例。 是否有人可以告诉我?

Answer 1:

简短的回答:

功能无法序列化成JSON。

说明:

JSON是基于JS文字语法的一个子集跨平台的序列化方案。 既然如此,它只能存储某些事情。 每http://www.json.org/ :

  • 物体:一个对象是一个无序集合的名称/值对。 对象开始于{(左括号),结尾}(右括号)。 每个名称后跟:(结肠)和名称/值对是由,(逗号)隔开。
  • 数组:数组是值的有序集合。 的阵列开始于[(左括号)和结尾(右括号)。 值由,(逗号)隔开。
  • 值:值可以是在双引号的字符串或数字,或真或假或为空,或物体或阵列。 这些结构可以嵌套。

功能不能序列化为JSON,因为另一个非JS平台,将无法反序列化,并使用它。 考虑在反向的例子。 说我在我的服务器,包含属性和方法PHP对象。 如果我系列化PHP的那个对象json_encode()和方法被列入输出,如何将我的JavaScript以往任何时候都能够解析和理解的方法PHP代码,更不用说使用这些方法呢?

你们看到的在你生成的JSON是toString()你正在使用的平台功能的价值。 serilizer调用JSON toString()上的任何正在连载这是不恰当的JSON。

我相信,您的解决方案是停止存储JSON /本地存储的实例。 相反,保存相关数据为您重新设置一个新的实例,当你需要一个实例。



Answer 2:

我知道这个问题已经回答了,但是我在这个偶然的事故,想分享一个解决这个问题,如果有人有兴趣。

而不是这样做:

var item = window.localStorage.getItem("itemKey");
item = JSON.parse(item);
item.save();

做这样的事情:

// get serialized JSON
var itemData = window.localStorage.getItem("itemKey");
//instantiate new Item object
var item = new Item();
// extend item with data
$.extend(item, JSON.parse(itemData));

// this should now work
item.save();

只要这将作为你想调用的函数(即,保存())为原型,而不是一个实例方法(通常倍的情况下,并且确实在OP的原来的问题的情况下。

$.extend方法是jQuery的的实用方法,但它是微不足道的推出自己的。



Answer 3:

你不能做到这一点,怎么也可以javascript可能知道项目有保存功能? JSON犯规允许用作DATAS。 刚看完JSON规范,你不能保存功能。

你需要做的是建立在你想股票的哈希序列化和反序列化方法。 将specifiy什么导出并解析相应的JSON字符串后,如何可以“唤醒”的对象。



Answer 4:

只能存储在DOMstorages平原对象(饼干,urlparams ...,需要[德]通过系列化的一切JSON.stringify / JSON.parse )。 所以,你发送的AJAX数据时做了什么

ajaxsend(this.data);

也适用于字符串序列化。 您只能存储数据,而不是实例属性(如原型,构造等)。 因此,使用

savestring(JSON.stringify(item.data));

这是可能的,因为item.data是这样一个普通的对象。 和恢复时,你将只能得到明文数据对象返回。 你的情况很容易重建Item从纯数据实例,因为你的项目在公共区域提供物业持有它们的值(仅):

var item = new Item;
item.data = JSON.parse(getjsonstring());


Answer 5:

放弃

没有一个全职的时间JS开发者,答案可能有一些小错误:

龙镗解释

正如@JAAulde提到的,你不能将对象序列化为JSON,因为具有的功能,您使用的是不允许这样做的技术。

很多人忘记或忽略了在应用程序中使用的对象作为保存/从存储恢复,可能不完全一样。

短期和快速解答

既然你已经封装的对象的数据成员到一个单一的领域,你可能会想尝试这样的事:

// create J.S. object from prototype
Item item = new Item();

// assign values as you app. logic requires
item.data.name = "John Doe";
item.data.description = "Cool developer, office ladies, love him";

// encoded item into a JSON style string, not stored yet
var encodedItem = JSON.stringify(item.data)

// store string as a JSON string
window.localStorage.setItem("itemKey", encodedItem);

// do several stuff

// recover item from storage as JSON encoded string
var encodedItem = window.localStorage.getItem("itemKey");

// transform into J.S. object
item.data = JSON.parse(encodedItem);

// do other stuff

干杯。



文章来源: Deserializing JavaScript object instance