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; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 我在哪里可以获得asp.net身份的rtm控制器模板?
- asp.net – 使用MySql和MVC 3上的成员资格向注册表单添加更
- asp.net-mvc – mvc4future无法在ASP.NET MVC 5中使用
- asp.net-mvc – MVC DB首先修复显示名称
- Asp.Net拒绝在某些页面上访问用户
- asp.net-mvc – ASP.Net MVC 2.0 Html.HiddenFor HtmlHelpe
- asp.net-mvc – 如何传递列表从控制器到MVC 3中查看
- asp.net-mvc – 将IQueryable泛型转换为JSON
- asp.net-mvc – 如何使用Data Annotations Extensions在属性
- 如何测量Live ASP.NET MVC Web应用程序的内存使用情况?
推荐文章
站长推荐
- asp.net 2.0中利用Ajax2.0实现JSON传送大量页面数
- ASP.net会员 – 添加角色
- asp-classic – 使用SMTP身份验证的经典ASP发送电
- asp.net-mvc – asp.net mvc – 缓存
- asp.net – 错误:必须声明标量变量“@data”
- asp.net-mvc-3 – MvcSiteMapProvider和web.conf
- asp.net-mvc – 实现多租户ASP.NET MVC应用程序的
- [ASP.NET MVC]为HtmlHelper添加一个RadioButtonL
- asp.net – 在iframe中丢失会话状态,但不在弹出窗
- asp.net-mvc – 表达式树可能不包含动态操作 –
热点阅读