从JSON

时间:2017-08-15 06:49:43

标签: javascript json typescript json-deserialization

不要这样做

这个问题有一些评论,对重建对象的概念缺乏认识。评论者要么不能也不会解释为什么他们认为这是一个坏主意,但是因为要求我得出相同的结论。这就是原因。

如果考虑MVVM,拥有模型和视图模型的目的是将行为与数据分开。这很有趣,因为面向对象的要点是将它们结合起来。但在分布式世界中,数据必须随身携带。如果您的代码和数据全部集中在一起,那么您必须发明MVVM或保持去除和重构对象。

取消和重新构造对象的代码是您不需要的测试和维护时间接收器,并引入了两种故障模式。不要这样做。有一个无方法的类来保存状态,一个无状态的类在无方法的类上运行。这是MVVM的本质,实际上只不过是 Memento 模式的应用。

  

纪念品(283)   在不违反封装的情况下,捕获并外化对象的内部状态,以便稍后可以将对象恢复到此状态。

     

设计模式,Gamma ,1995

原始问题

我的视图模型的数据作为JSON在客户端JS和服务器Web API之间来回传递。

众所周知,JSON.stringify(object)仅序列具有非{0}的非空值的成员。因此,Function将从对象中删除所有方法。

我当前的实现将每个图节点实现为具有Seri​​alise和Deserialise方法的Typescript类。 JQuery.ajax调用Web API并隐式地将结果JSON解析为对象定义的DAG,每个对象定义都有一个Type属性,指示序列化之前它是哪种类。我有一个按名称索引的构造函数的映射,并检索相应的构造函数,并将数据作为构造函数参数传递。

根据类型可能会有孩子;如果是这样的话,那么事情会递归地向下移动。

我一直在想是否,不是复制所有属性值,我不能只分配一个合适的原型。你可能会说,把山带到Mahomed。这将消除我的代码库中的一些混乱。

在我写这篇文章时,我发现我可以使用$ .extend,但我正在逐步清除代码库中的jQuery out ,所以这将是一个逆行的步骤。

  • 在我的原型中有没有任何已知的危险?
  • 有没有人有更好的主意?除了$ .extend,我的意思是。根据喜好,TypeScripty。

在评论中已经观察到,分配原型意味着永远不会调用构造函数。这是无关紧要的。已经设置了对象状态,只需要使方法可用。

1 个答案:

答案 0 :(得分:1)

我最近用方法构建了对象,可以将内容序列化然后重构。

我只是添加了一个可以接受JSON对象并将其分配给自身的参数。

使用普通对象的示例:



function myObject() {
  this.valueA = 1;
  this.valueB = 2;
  this.valueC = 3;

  this.add = function() {
    return this.valueA + this.valueB + this.valueC;
  };
}

var o = new myObject();
console.log(o.add());
console.log(JSON.stringify(o));




如果你序列化了这个,你会得到:

{"valueA":1,"valueB":2,"valueC":3}

现在,为了重建这个,您可以像这样在对象中添加Object.assign()并将其与self合并:

function myObject(json) {
  this.valueA = 0;
  this.valueB = 0;
  this.valueC = 0;

  this.add = function() {
    return this.value1 + this.value2 + this.value3;
  };

  Object.assign(this, json); // will merge argument with itself
}

如果我们现在将已解析的JSON对象作为参数传递,它将自己与重新创建所拥有内容的对象合并:



var json = JSON.parse('{"valueA":1,"valueB":2,"valueC":3}')

function myObject(json) {
  this.valueA = 0;
  this.valueB = 0;
  this.valueC = 0;

  this.add = function() {
    return this.valueA + this.valueB + this.valueC;
  };

  Object.assign(this, json); // will merge argument with itself
}

var o = new myObject(json);  // reconstruct using original data
console.log(o.add());




如果您现在通过数组拥有子项,则只需在链中递归重复该过程。

(奖励是您也可以通过这种方式传递选项。)