将JSON日期信息解析为C#DateTime

我有一个返回CLR对象的WCF服务。 该对象定义如下:

[DataContract] public class Person { [DataMember] public string FullName { get { return fullName; } set { id = fullName; } } private string fullName = string.Empty; [DataMember] public DateTime BirthDate { get { return birthDate; } set { birthDate = value; } } } 

正在创建此对象的实例并从我的WCF服务返回。 此服务如下所示:

 [OperationContract] [WebGet(UriTemplate = "/GetPersonByID/{id}", ResponseFormat = WebMessageFormat.Json)] public Person GetPersonByID(string id) { Person person = FindPersonByID(id); return person; } 

当我在我的应用程序中得到响应时,我可以成功提取FullName值。 但是,我还没有成功地将BirthDate转换为客户端应用程序中的C#DateTime对象。 转换为字符串时,BirthDate看起来像这样:

 \/Date(1297367252340-0500)\/ 

如何将其转换为C#DateTime实例?

谢谢!

这有两个选择:

您可以使用System.Web.Script.Serialization.JavaScriptSerializer中的Deserialize方法(在System.Web.Extensions.dll中)。

或者您可以使用System.Runtime.Serialization.Json.DataContractJsonSerializer中的ReadObject方法(在System.Runtime.Serialization.dll中或在System.ServiceModel.Web.dll中的.NET 3.5中)。

确保您的日期包含在以下引号中:

 string dateString = @"""\/Date(1297367252340-0500)\/"""; 

日期是这种奇怪格式的原因是DateTime是WCF中的原语。 不幸的是,在JSON中没有用于序列化日期和时间的通用标准化格式 – 各种框架使用各种字符串格式。

困境是WCF需要本地理解通过线路的特定字符串确实是DateTime,而不仅仅是另一个普通的香草JSON字符串。 因此奇怪的格式。 一旦DataContractJsonSerializer遇到以\ / Date开头的日期,它就会开始尝试将其解析为日期。

现在,要回答您的问题,当您通过网络发送DateTime时,这取决于您是使用Web浏览器客户端,Silverlight客户端还是WCF客户端。

WCF客户端或Silverlight 2+客户端应该没有问题 – 他们应该自动使用DataContractJsoNSerializer,如果他们不使用它,你可以手动插入DCJS。

如果您使用的是Web客户端,则可以包含ASP附带的.js文件。 NET AJAX(我相信它被称为MicrosoftAspNetAjax.js,或MicrosoftAjax.cs,虽然名称可能已更改)。 它的反序列化函数也会自动解析这些日期。

希望有所帮助!

好吧,最近我不得不在Android Mobile(Xamarin Studio)应用程序项目上工作,因为在部署到这个特定设备版本时抛出的错误导致我无法使用Newtonsoft Json(Json.NET)(Android API 16版本4.2.1) 。

幸运的是我找到了json(System.Json)的替代库。 但是,此库无法隐式地将JSON日期强制转换为C#DateTime。

我已经从字符串json日期(即/ Date(1389435240000 + 0000)/)创建了以下两个函数,用于可空的日期和日期转换

代码可以改进,但它现在可以完成工作

 public static DateTime? ConvertToNallableDate(string date) { DateTime? val = null; /* /Date(1389435240000+0000)/*/ try{ if(!string.IsNullOrEmpty(date)) { date = date.Replace ("/Date(", string.Empty).Replace (")/", string.Empty); int pIndex = date.IndexOf ("+"); if(pIndex < 0) pIndex = date.IndexOf("-"); long millisec = 0; date = date.Remove (pIndex); long.TryParse (date, out millisec); System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-GB"); DateTime newDate = DateTime.Parse ("1970,1,1", ci); newDate = newDate.AddMilliseconds(millisec); val = newDate == null ? (DateTime?)null : newDate; } }catch { val = null; } return val; } public static DateTime ConvertToDate(string date) { DateTime val = new DateTime(); /*/Date(1389435240000+0000)/*/ try{ if(!string.IsNullOrEmpty(date)) { date = date.Replace ("/Date(", string.Empty).Replace (")/", string.Empty); int pIndex = date.IndexOf ("+"); if(pIndex < 0) pIndex = date.IndexOf("-"); long millisec = 0; date = date.Remove (pIndex); long.TryParse (date, out millisec); System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-GB"); DateTime newDate = DateTime.Parse ("1970,1,1", ci); val = newDate.AddMilliseconds(millisec); } }catch { val = new DateTime(); } return val; } 

这解决了我的问题

 using System.Web.Script.Serialization; //code JavaScriptSerializer json_serializer = new JavaScriptSerializer(); DateTime ddate = json_serializer.Deserialize(@"""\/Date(1326038400000)\/""").ToLocalTime();