使用.NET JavaScriptSerializer.Deserialize与客户端的DateTime

问题描述 投票:7回答:4

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

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

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

究竟什么格式是Deserialize<>()方法期望将其解析为.NET DateTime

javascript .net json date datetime
4个回答
7
投票

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

我编写了一个自定义函数来调整JSON.stringify()的输出,包括这些反斜杠。所以,我可以保持几乎没有变化,只能在JSON.stringify()数据中取代customJSONstringify()$.ajax():param。

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

2
投票

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(.\*)/语法,它将不会被替换。


0
投票

想出来 - 它的格式是\/Date(ticks)\/

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


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 () {}
});
© www.soinside.com 2019 - 2024. All rights reserved.