7

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

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

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

Deserialize<>()为了将其解析为 .NET的方法所期望的格式到底是什么DateTime

4

5 回答 5

8

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

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

function customJSONstringify(obj) {
    return JSON.stringify(obj).replace(/\/Date/g, "\\\/Date").replace(/\)\//g, "\)\\\/")
}
于 2013-04-09T17:10:36.060 回答
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(.\*)/语法的文本不会被替换。

于 2015-10-26T19:46:41.523 回答
1

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

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

于 2012-08-07T20:02:16.220 回答
0

收到错误后

/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 () {}
});
于 2018-09-05T11:45:06.343 回答
0

我建议改用 JsonConvert.DeserializeObject<> 。

于 2020-03-10T10:05:53.860 回答