加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-2 – JavaScriptSerializer没有正确反序列化DateTim

发布时间:2020-12-16 00:10:58 所属栏目:asp.Net 来源:网络整理
导读:有一个问题,其中DateTime / TimeSpan似乎没有使用JavaScriptSerializer正确反序列化. 当我在反序列化后得到Object时,TimeSpan为空,如果我使用DateTime,那么时间就完全没了. 找到了这篇文章,但它并没有真正帮助我太多. http://www.west-wind.com/weblog/ShowP
有一个问题,其中DateTime / TimeSpan似乎没有使用JavaScriptSerializer正确反序列化.
当我在反序列化后得到Object时,TimeSpan为空,如果我使用DateTime,那么时间就完全没了.
找到了这篇文章,但它并没有真正帮助我太多.
http://www.west-wind.com/weblog/ShowPost.aspx?id=471402

有人有主意吗?我应该尝试json.net库吗?

public class JsonFilter : ActionFilterAttribute
{
    public string Param { get; set; }
    public Type JsonDataType { get; set; }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Request.ContentType.Contains("application/json"))
        {
            string inputContent;
            using (var sr = new StreamReader(filterContext.HttpContext.Request.InputStream))
            {
                inputContent = sr.ReadToEnd();
            }

            JavaScriptSerializer serializer = new JavaScriptSerializer();
            var result = serializer.Deserialize(inputContent,JsonDataType);
            filterContext.ActionParameters[Param] = result;
        }
    }
}

public class RosterItem
{
    public RosterItem()
    {
        comments = new List<Form.Comment>();
    }
    public Boolean dirty { get; set; }
    public int id { get; set; }
    public int staffId { get; set; }
    public String description { get; set; }
    public int activityId { get; set; }
    public DateTime date { get; set; }
    public TimeSpan startTime { get; set; }
    public TimeSpan endTime { get; set; }
    public List<Form.Comment> comments { get; set; }
}

    [JsonFilter(Param = "rosterItem",JsonDataType = typeof(RosterItem))]
    public int SaveRosterEntry(RosterItem rosterItem)
    {
        RosterEntry rosterEntry = rosterEntryRepository.GetRosterEntry(rosterItem.id);
        if (rosterEntry == null)
        {
            rosterEntry = new RosterEntry();
            rosterEntryRepository.Add(rosterEntry);
        }
        rosterEntry.ActivityID = rosterItem.activityId;
        rosterEntry.StartTime = rosterItem.startTime;
        rosterEntry.EndTime = rosterItem.endTime;
        rosterEntry.RosterDate = rosterItem.date;
        rosterEntry.RosterEmployeeID = rosterItem.staffId;            
        rosterEntryRepository.Save();
        return rosterEntry.RosterEntryID;
    }

解决方法

我在GitHub上的帖子中找到了答案:

https://github.com/NancyFx/Nancy/issues/336

基本上答案是创建一个新的TimeSpanJsonConverter,它继承自JavaScriptConverter,然后将其传递给序列化程序类的实例:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer()
serializer.RegisterConverters(new[] { new TimeSpanJsonConverter() });

全班供参考(由GrumpyDev编写):

public class TimeSpanJsonConverter : JavaScriptConverter
{
    public override IEnumerable<Type> SupportedTypes
    {
        get
        {
            return new[] { typeof(TimeSpan) };
        }
    }

    public override object Deserialize(IDictionary<string,object> dictionary,Type type,JavaScriptSerializer serializer)
    {
        return new TimeSpan(
            this.GetValue(dictionary,"days"),this.GetValue(dictionary,"hours"),"minutes"),"seconds"),"milliseconds"));
    }

    public override IDictionary<string,object> Serialize(object obj,JavaScriptSerializer serializer)
    {
        var timeSpan = (TimeSpan)obj;

        var result = new Dictionary<string,object>
            {
                { "days",timeSpan.Days },{ "hours",timeSpan.Hours },{ "minutes",timeSpan.Minutes },{ "seconds",timeSpan.Seconds },{ "milliseconds",timeSpan.Milliseconds }
            };

        return result;
    }

    private int GetValue(IDictionary<string,string key)
    {
        const int DefaultValue = 0;

        object value;
        if (!dictionary.TryGetValue(key,out value))
        {
            return DefaultValue;
        }

        if (value is int)
        {
            return (int)value;
        }

        var valueString = value as string;
        if (valueString == null)
        {
            return DefaultValue;
        }

        int returnValue;
        return !int.TryParse(valueString,out returnValue) ? DefaultValue : returnValue;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读