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

时间:2012-08-07 19:04:26

标签: javascript .net json date datetime

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

  

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

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

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

5 个答案:

答案 0 :(得分: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, "\)\\\/")
}

答案 1 :(得分: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(.\*)/语法,则不会被替换。

答案 2 :(得分:0)

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

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

答案 3 :(得分: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 () {}
});

答案 4 :(得分:0)

我建议改用JsonConvert.DeserializeObject <>。