2011-02-11 89 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; 
     }