[英]Parsing a JSON date info into a 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,而不仅仅是另一个简单的vanilla 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)应用程序项目上工作,由于在部署到此特定设备版本期间抛出的错误(Android API 16版本4.2.1),我无法使用Newtonsoft Json(Json.NET) 。
幸运的是,我找到了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<DateTime>(@"""\/Date(1326038400000)\/""").ToLocalTime();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.