C# 从.Net web方法修复JSON日期序列化

C# 从.Net web方法修复JSON日期序列化,c#,ajax,entity-framework,serialization,webforms,C#,Ajax,Entity Framework,Serialization,Webforms,我目前正在从事一个项目,通过ajax将.Net类型发送到客户端应用程序。我对序列化对象并将其设置为客户端没有任何问题 当我获取完全相同的对象并通过web方法将其发回服务器时,我遇到了以下问题:/Date(1373950800000)/不是DateTime的有效值。这很烦人,因为Microsoft就是这样给我的,但这不是重点 有人能快速解决这个问题吗?我想要一种无缝的方法来实现这一点,而无需在从ajax调用返回对象之前立即更改对象。这一方法将帮助您解决错误: 这是我用于这些事情的方法: 首先,需要

我目前正在从事一个项目,通过ajax将.Net类型发送到客户端应用程序。我对序列化对象并将其设置为客户端没有任何问题

当我获取完全相同的对象并通过web方法将其发回服务器时,我遇到了以下问题:
/Date(1373950800000)/不是DateTime的有效值。
这很烦人,因为Microsoft就是这样给我的,但这不是重点


有人能快速解决这个问题吗?我想要一种无缝的方法来实现这一点,而无需在从ajax调用返回对象之前立即更改对象。

这一方法将帮助您解决错误:


这是我用于这些事情的方法:

首先,需要清除日期参数中的垃圾

String unixDate = "/Date(1373950800000)/";
unixDate = unixDate.Replace("/Date(","").Replace(")/", "");
现在,由于.NET和unix以不同的方式测量时间,您必须通过创建一个设置为1970年1月1日的日期,然后添加通过日期的数字部分来补偿时间

DateTime dotNetDate = new DateTime(1970, 1, 1);
dotNetDate = dotNetDate.AddMilliseconds(Convert.ToInt64(unixDate)

您还应该注意到,此处的精度会降低-.NET日期精确到最接近的纳秒,而unix日期精确到最接近的毫秒;
JsonDataContractSerializer
(ASP.NET MVC的默认序列化程序)或
NewtonSoft Json序列化程序
(ASP.NET Web API的默认序列化程序)


有关此日期混乱问题的可视示例以及可能的解决方案,请查看。

尝试发送带有转义斜杠的日期。我有一个iPad客户端,它将JSON发布到ASP.NET WebAPI服务方法,我们必须以这种方式发送日期:


“到期”:“\/Date(1335830400000)\/”

在序列化时处理日期格式 以下代码将解决您的问题

   JsonConvert.SerializeObject(yourobject, Formatting.Indented,
                    new JsonSerializerSettings
                    {
                         DateFormatHandling = DateFormatHandling.IsoDateFormat
                    });

它将以2009-02-15T00:00:00Z格式生成日期

您在服务器端使用哪个序列化程序?您是否从服务器获取字符串
/Date(1373950800000)/
?或者只是
1373950800000
?搜索并找到了这篇文章,希望这会有所帮助:)@KarlAnderson是ASP.NET 4.0的默认版本uses@MattBodily这篇文章很有帮助,但没有帮助,因为我不想让客户端对其进行转换,因为Microsoft自己的序列化程序无法对其进行反序列化。此解决方案仅适用于检索(读取:
GET
request)日期,如果您试图设置(读取:
POST
request)日期,那么您将遇到相同的问题,因为服务器端使用的序列化程序将损坏日期。@KarlAnderson-您可以用一个例子来详细说明日期在发布后的外观吗?我没有遇到过这个curlypaul-这不是日期如何处理帖子的问题,那就好了,当序列化程序试图将值转换回.NET日期时,问题就出现了;它会被弄坏的。请参阅我答案中的链接。我遇到的问题是,我正在手动序列化它,而不是让.NET处理它。我想保持相同的
DateTime
在.NET中键入,而不必通过自己的诡计来实现。我使用的是ASP.NET webforms 4.0。该项目的一个要求。链接到网页使用javascript来解决该问题。不是为了解决使用了一个次优的序列化程序这一事实。我不太热衷于强迫客户端在获得序列化信息后立即对直接来自服务器的序列化信息进行更改…编辑:我尝试了is,但出现了相同的错误。据我所见,服务器还发送带有前斜杠的日期。当我使用Fiddler调用我的服务方法时,我将日期视为
“\/Date(1334938675734)\/”
。Javascript自动去除反斜杠,但我强制使用字符串literal的
\/Date(1334938675734)\/
,它仍然失败,并出现相同的错误。请注意,对于尝试此操作的人,JsonConvert是NewtonSoft.Json,不是.NETJSON,因此必须使用NuGet(或其他方法)安装它。有关更多信息,请参阅链接和相关问题。使用此解决方案,您可以创建返回字符串的web方法,但我仍然希望返回对象。通过返回对象层次结构,google chromes devtools仍然可以创建返回数据的树状视图。
   JsonConvert.SerializeObject(yourobject, Formatting.Indented,
                    new JsonSerializerSettings
                    {
                         DateFormatHandling = DateFormatHandling.IsoDateFormat
                    });