【问题标题】:Setting up jQuery ajax converter for json parsing为 json 解析设置 jQuery ajax 转换器
【发布时间】:2012-06-21 17:33:16
【问题描述】:

我正在尝试解析 JSON 响应以将 ASP.NET 日期转换为 javascript 日期。

实际响应如下:

{"Id":1,"Title":null,"Description":null,"Content":null,"PropagateModel":false,"Status":0,"ComponentPublishDate":"\/Date(1340299653555)\/"}

我扩展了 javascript 字符串对象以进行从 \/Date(1340299653555)\/new Date(1340298914781) 的正则表达式转换

String.prototype.parseWithJSONDate = function () {
   return this.replace(/\/Date\((.*?)\)\//gi, 'new Date($1)');
};

然后我设置一个 converter 过滤器来进行实际的解析。

    $.ajaxSetup({
      dataFilter: function(data, dataType) {
        if (dataType === "json") {
          return data.parseWithJSONDate();
        }
        return data;
      }
    });

此转换器不起作用。我遇到的第一个问题是转换器返回后响应会以某种方式损坏。我通过在函数结束时调用JSON.parse 来解决这个问题,就像return JSON.parse(res) 一样。为什么我需要解析一个已经是 JSON 字符串的字符串??

第二个问题是实际的正则表达式似乎没有替换值。奇怪的是,我在函数之外对一个示例 JSON 字符串进行了测试,它工作得很好。

任何人都可以提出任何建议吗?谢谢!

更新 1 我想我找到了第一个问题的答案。我的转换器针对 json 和 text 数据类型运行。这可能是我必须将返回值显式转换为 JSON 的原因。我从转换器中删除了文本数据类型,并相应地更新了其余代码。

更新 2 我最终创建了一个新的视图模型,其中日期是一个格式化的字符串。这不是世界上最好的事情,但比搞砸 jQuery ajax 事件要好。

【问题讨论】:

  • 你希望它返回一个 JSON 字符串,还是一个 JavaScript 对象。
  • 根据我的理解,转换器已经接受了一个 json 字符串。所以,我假设它应该返回一个 json 字符串。至少这是我正在尝试做的。
  • 默认情况下,text json 转换器返回一个表示 JSON 字符串的 JavaScript 对象。如果您只是想在 jQuery 评估它之前更改 json 字符串,请使用 dataFilter。
  • 谢谢。我刚刚在您回复并删除文本数据类型之前发现了问题。我仍然无法替换日期。不确定我的正则表达式是否在某处轰炸或缺少其他东西。

标签: jquery ajax json asp.net-mvc-3 converter


【解决方案1】:

尝试改用dataFilter

$.ajaxSetup({
    dataFilter: function(data,dataType) {
        if (dataType === "json") {
            return data.parseWithJSONDate();
        }
        return data;
    }
});

这假定您的 parseWithJSONDate 方法返回一个有效的 json 字符串。然后,您只需使用 json 作为您的数据类型。

dataFilter 方法的目的是清理原始响应文本,我认为这非常适合这种情况。只要您返回有效的 json,jquery 就会对其进行解析并将其转换为正常的 javascript 对象。

编辑:现在我想它可能会失败,在 new Date() 上,因为那不是有效的 json。

【讨论】:

  • 我确实按照您的建议切换到数据过滤器。从声明中删除文本数据类型后,我的转换器甚至没有触发。数据过滤器仍然没有转换日期。我不确定 new Date() 不是有效的 JSON 是什么意思。我不想评估它,只是简单地修复格式并在以后需要时评估它。
  • 如果你的dataType是json,不管你告诉它,jQuery都会评估它。
【解决方案2】:

我最终在服务器上将所有日期转换为适当的格式并将值返回给客户端。不是最佳解决方案,但我不知道如何使用数据过滤器进行转换。

【讨论】:

    猜你喜欢
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多