【问题标题】:Dojo JSON serialization, using various serialization strategiesDojo JSON 序列化,使用各种序列化策略
【发布时间】:2013-10-28 20:25:22
【问题描述】:

我在将 DateTextBox 和 TimeTextBox 的输入序列化为 JSON 时遇到问题 - 在序列化期间进行时区转换,这迫使我将时区发送到服务器并在那里进行适当的调整。

为了防止出现这种情况,我想更改日期格式以进行序列化。我可以更改 Date 的原型,如 here 所述(我已经在 JSFiddle 中完成了该操作),但我不希望更改单个请求范围内的行为。类似的东西:

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

Dojo 是否提供了实现它的方法,或者唯一的方法是全局更改 Date 的原型?

【问题讨论】:

  • toJSON() 方法(如链接文章中所述)是否不能满足您的需求?例如,在您的 Form 对象中,将您的专用 toJSON 序列化附加到该表单中的所有 Date 输入? (因此将影响隔离到那种形式?)
  • @bishop 我想将序列化的责任交给调用 REST 通道的方法,从而隔离它所属位置的代码,并断言应用程序的其他部分(可能使用其他远程服务)不受影响。
  • 从长远来看,我建议您以 UTC 格式通过网络向两个方向发送 all 日期/时间。这不是您已经在使用 Javascript Date 对象进行序列化了吗?
  • @Darien 问题是客户端时区偏移可以是任意的,所以不,我不能使用服务器进行开箱即用的操作。 JavaScript 小部件可能在 UTC 上工作,但 DoJo 的 TimeTextBox 正在当地时间上工作。

标签: javascript json date serialization dojo


【解决方案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);
});

我建议将其编写为 dojo/request 的 mixin,然后为自己创建一个具有此行为的自定义请求类,然后​​根据需要使用该自定义请求对象。

这感觉很老套,但我认为它会满足您的需求(据我了解!)。

【讨论】:

  • 是的,非常老套。如果 dojo 在 stringify 之前将对象提供给替换器,那将不会很糟糕。无论如何,这是我可以考虑的替代更改原型的解决方案。
  • @ŁukaszL:公平地说,它只是传递给原生的JSON.stringify,它的行为也是如此。整个对象可用,但在迭代期间不可用。 JSON.stringify({a:new Date()}, function (k,v) { console.log(v); return v; }) 明白我的意思。很高兴这对你有用!
猜你喜欢
  • 2014-08-15
  • 2018-11-15
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 2017-12-24
相关资源
最近更新 更多