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

10

我有一个返回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 实例?

谢谢!


1
没有所谓的 JSON 日期。 - JeremyP
4个回答

5

问题是,我的客户端是Silverlight应用程序。Silverlight没有Deserialize方法。 - user70192
您能尝试使用DataContractJsonSerializer吗?文档称其适用于Silverlight 3和4。 - RP Niemeyer

4
这个日期格式之所以这么奇怪,是因为DateTime在WCF中是一个原始类型。不幸的是,在JSON中序列化日期和时间没有普遍标准的格式 - 各种框架使用各种字符串格式。
问题在于,WCF需要本地理解特定的字符串确实是DateTime,而不仅仅是另一个普通的JSON字符串。因此采用了奇怪的格式。只要DataContractJsonSerializer遇到以\/Date开头的日期,它就开始尝试将其解析为日期。
现在,回答你的问题,当你通过网络传输DateTime时,这取决于你是否使用Web浏览器客户端、Silverlight客户端或WCF客户端。
WCF客户端或Silverlight 2+客户端不应该有这个问题 - 它们应该自动使用DataContractJsoNSerializer,如果它们没有使用它,你可以手动插入DCJS。
如果你正在使用Web客户端,你可以包含随ASP.NET AJAX一起提供的.js文件(我相信它被称为MicrosoftAspNetAjax.js或MicrosoftAjax.cs,但名称可能已经改变)。它的deserialize函数也会自动解析这些日期。
希望能对您有所帮助!

比起简单地说“JSON日期不存在”,这个回答更有用和信息丰富。 - jk7

3

最近我必须在一个Android移动应用项目中工作,但由于在部署到特定设备版本(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;
        }

如果JSON日期中没有时区后缀,则会出现错误。 - Sharique Abdullah

1

这解决了我的问题

using System.Web.Script.Serialization;


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接