【问题标题】:Using .NET JavaScriptSerializer.Deserialize with DateTime from client使用 .NET JavaScriptSerializer.Deserialize 和来自客户端的 DateTime
【发布时间】:2012-08-04 20:23:31
【问题描述】:

我正在使用JavaScriptSerializer.Deserialize<>() 方法将从客户端收到的 JSON 转换为自定义 C# 类。该类的属性之一是DateTime。目前Deserialize<>() 方法抛出一个错误,说

“(我的日期字符串)”不是 DateTime 的有效值。

我尝试使用几种不同的格式发送日期,包括由各种内置 JavaScript Date() 方法生成的刻度和其他格式,但它们都不起作用。

Deserialize<>() 方法需要什么格式才能将其解析为 .NET DateTime

【问题讨论】:

    标签: javascript .net json date datetime


    【解决方案1】:

    我建议改用 JsonConvert.DeserializeObject。

    【讨论】:

      【解决方案2】:

      收到错误后

      /Date(1347992529530)/ 不是 DateTime 的有效值。

      使用@Luis Perez 建议的替换对我有用。

      var data = ko.toJSON({ objext: obj});
      $.ajax({
          url: "/API/API.asmx/SaveObject",
          type: "POST",
          dataType: "json",
          contentType: "application/json; char-utf8;",
          data: data.replace(/\/Date/g, "\\\/Date").replace(/\)\//g, "\)\\\/"),
          success: function (r) {},
          error: function (e) {},
          complete: function () {}
      });
      

      【讨论】:

        【解决方案3】:

        Eduardo 在 JavaScript 方面提供了一个解决方案。您还可以选择在服务器端更正问题。

        // C# Side
        var obj = Regex.Replace(json, @"/Date\((\-?\d*)\)/", @"\/Date($1)\/")
        

        请注意,我使用了单个替换。这比使用两个replace() 更安全、更准确。可以使用相同的表达式来替换 JavaScript 示例中的表达式。

        // Safer version of function using a single replace
        function customJSONstringify(obj) {
            return JSON.stringify(obj).replace(/\/Date\((\-?\d*)\)\//g, "\\/Date($1)\\/");
        }
        

        两次调用replace() 可能会导致第二次替换替换与数据无关的文本。请注意,更安全的是,可以更新表达式以仅替换前面和后面跟单引号的 /Date(.\*)/ 实例。这将确保如果有描述 /Date(.\*)/ 语法的文本不会被替换。

        【讨论】:

          【解决方案4】:

          你是对的,@friendlycello。不幸的是,JSON.stringify() 从此 \/Date(ticks)\/ .Net 序列化程序 DateTime 格式中删除了反斜杠。

          我编写了一个自定义函数来调整来自JSON.stringify() 的输出,包括这些反斜杠。所以,我可以保持几乎不变,只在$.ajax() 数据:参数中从JSON.stringify() 替换为customJSONstringify()

          function customJSONstringify(obj) {
              return JSON.stringify(obj).replace(/\/Date/g, "\\\/Date").replace(/\)\//g, "\)\\\/")
          }
          

          【讨论】:

          • 嗨,[{"ChequeNo":"12","ChequeValue":"333","ChequeDate":"23/10/2018","PendDocStatus":false}],为此我面临着23/10/2018 is not a valid value for DateTime. 的 System.FormatException。你能帮我解决吗?
          【解决方案5】:

          想通了 - 它在格式为 \/Date(ticks)\/ 时有效

          注意:如果你使用 JSON.stringify 创建你的请求,它会自动转义你的反斜杠,导致服务器端解析错误。我发现这样做的唯一方法是在服务器端用\ 替换所有\\ 实例。

          【讨论】:

          • 嗨,对于这个数据"[{\"ChequeNo\":\"123\",\"ChequeValue\":\"2322\",\"ChequeDate\":\"Date(1573324200000)\",\"PendDocStatus\":false}]",我正面临 System.FormatException Date(1573324200000) is not a valid value for DateTime.。你能帮我解决吗?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-23
          • 2010-09-08
          • 2011-04-04
          • 1970-01-01
          • 1970-01-01
          • 2015-08-06
          相关资源
          最近更新 更多