2013-10-28 29 views
0

我有将DateTextBox和TimeTextBox的输入序列化为JSON的问题 - 在序列化期间进行时区转换,这迫使我发送时区到服务器并在那里做适当的修改。Dojo JSON序列化,使用各种序列化策略

为了防止出现我想更改序列化目的的日期格式。我可以修改Date的原型,如here(我在JSFiddle中完成的那样),但我不希望改变单个请求范围的行为。类似的东西:

someDojoUtil.jsonSerialize(obj, {option1: 'value1'...}) 

不道场实现它提供的方式,或者唯一的办法就是在全球范围内ALTER日期的原型?

+0

toJSON()方法(如链接文章中提到的)不能满足您的需要吗?例如,在您的Form对象中,将专门的toJSON序列化附加到该表单中的所有Date输入? (因此将影响隔离到那个表单上?) – bishop

+0

@bishop我想将序列化的责任放到调用REST通道的方法上,从而隔离它所属的地方的代码并断言其他部分应用程序(可能使用其他远程服务)不受影响。 –

+0

从长远来看,我建议您在UTC的电线上双向发送*全部*日期/时间。是不是你已经做了Javascript的日期对象被序列化? – Darien

回答

1

根据OP中的注释阐述,我将使用Json.stringify的第二个参数,即所谓的“替换器”。事情是这样的:

require(['dojo/json'], function(Json) { 
    function replacer(key, value) { 
     if ('string' === typeof (value)) { 
      var d = new Date(value); 
      if (isNaN(d.getTime())) { 
       return value; // string, but not a date 
      } 

      // do whatever you want to do, this is just an example 
      d.setSeconds(0); 

      return d.toJSON(); 
     } 
     return value; 
    } 
    var data = {'a':new Date(), 'b':123, 'c':'foo', 'd':[new Date()]}; 
    var str = Json.stringify(data, replacer); 
    console.log(str); 
}); 

我建议写这为道场/请求一个mixin,然后创建自己有此行为的自定义请求类,然后​​使用自定义的对象需要。

这感觉很骇人,但我认为它会满足你的需求(正如我理解它!)。

+0

是的,非常哈克。如果dojo在交付给替代者之前将对象给予,那么这种做法就不会发霉。无论如何,这是我可以考虑的替代改变原型的解决方案。 –

+0

@ŁukaszL:对于Dojo是公平的,它只是传递给本地[JSON.stringify](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify ),其行为也如此。整个对象是可用的,但不是在迭代过程中。 'JSON.stringify({a:new Date()},function(k,v){console.log(v); return v;})'看看我的意思。很高兴为您效力! – bishop