2011-02-11 119 views
9

我有一个WCF服务,返回一个CLR对象。此对象的定义如下:解析JSON日期信息到C#DateTime

[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实例?

谢谢!

+1

有没有这样的事情作为JSON日期。 – JeremyP 2011-02-11 16:31:01

回答

5

这里有两种选择:

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

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

确保你的约会被包裹在类似行情:

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

问题是,我的客户端是Silverlight应用程序。 Silverlight没有Deserialize方法。 – user70192 2011-02-11 18:37:20

+0

您是否要尝试DataContractJsonSerializer?该文档声称它在Silverlight 3和4中可用。 – 2011-02-11 18:42:04

4

原因的日期是在这个奇怪的格式是日期时间是在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,但名称可能已更改)。它的反序列化函数也会自动解析这些日期。

希望有帮助!

+0

比简单地说没有JSON日期之类的东西更有用和信息丰富的答案。 – jk7 2016-02-03 11:12:52

1

这解决了我的问题

using System.Web.Script.Serialization; 


//code 
JavaScriptSerializer json_serializer = new JavaScriptSerializer(); 
DateTime ddate = json_serializer.Deserialize<DateTime>(@"""\/Date(1326038400000)\/""").ToLocalTime(); 
3

好吧,我最近不得不在Android手机(Xamarin工作室)应用项目中,我无法使用Newtonsoft JSON(Json.NET)因工作过程中引发的错误部署到此特定设备版本(Android API 16版本4.2.1)。

幸运的是,我找到了json的另一个库(System。JSON)。但是,这个库没有隐式地将JSON日期转换为C#DateTime的方法。

我已经创建了一个可为空的日期和日期的转换中以下两个函数从一个字符串JSON日期(即/日期(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; 
     }