繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM