2010-12-08 123 views
1

存在問題,其中DateTime/TimeSpan似乎沒有使用JavaScriptSerializer正確反序列化。 當我在反序列化後將對象返回時,TimeSpan爲空,並且如果我使用DateTime,那麼時間都是不合時宜的。 找到這篇文章,但它並沒有真正幫助我太多。 http://www.west-wind.com/weblog/ShowPost.aspx?id=471402JavaScriptSerializer非反序列化DateTime/TimeSpan正確

任何人有任何想法?我應該試試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; 
    } 

回答

2

我發現在GitHub上在下面的帖子答案:

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

基本上答案是創建一個新的TimeSpanJsonConverterJavaScriptConverter繼承,然後傳遞到您的序列化器類的一個實例:

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"), 
      this.GetValue(dictionary, "minutes"), 
      this.GetValue(dictionary, "seconds"), 
      this.GetValue(dictionary, "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, object> dictionary, 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; 
    } 
} 
+1

該解決方案非常適合解決TimeSpan序列化,但我認爲這個問題與DateTime有關。 – 2013-12-09 03:43:56

相關問題