我正在使用JavaScriptSerializer.Deserialize<>()
方法将我从客户端收到的JSON转换为自定义C#类。该类的一个属性是DateTime
。目前Deserialize<>()
方法抛出错误,说
“(我的日期字符串)”不是DateTime的有效值。
我尝试使用几种不同的格式发送日期,包括由各种内置JavaScript Date()方法生成的刻度和其他格式,但它们都没有用。
Deserialize<>()
方法究竟是什么格式才能将其解析为.NET DateTime
?
答案 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 <>。