Custom JavaScriptConverter for DateTime?

前端 未结 10 789
走了就别回头了
走了就别回头了 2020-12-02 19:18

I have an object, it has a DateTime property... I want to pass that object from an .ashx handler back to a webpage via AJAX/JSON... I don\'t want to use 3rd party controls..

10条回答
  •  半阙折子戏
    2020-12-02 19:38

    Actually there is an ugly way, create a JavaScriptConverter for the container (Person/Article/Whatever) class

    Container:

    public class Article
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public DateTime Date { get; set; }
    }
    

    Converter:

    public class ArticleJavaScriptConverter : JavaScriptConverter
    {
        public override IEnumerable SupportedTypes
        {
            get { return new Type[] { typeof(Article) }; }
        }
    
        public override object Deserialize(
            IDictionary dictionary, 
            Type type, JavaScriptSerializer serializer)
        {
            DateTime date = 
                DateTime.ParseExact(dictionary["date"] as string, "s", null);
    
            return
                new Article()
                {
                    Id = (int)dictionary["id"],
                    Title = dictionary["title"] as string,
                    Date = date
                };
        }
    
        public override IDictionary Serialize(
            object obj, JavaScriptSerializer serializer)
        {
            var article = obj as Article;
            var result = new Dictionary();
    
            if (article != null)
            {
                this.SerializeInternal(article, result);
            }
    
            return result;
        }
    
        private void SerializeInternal(
            Article article, IDictionary result)
        {
            result.Add("id", article.Id);
            result.Add("title", article.Title);
            result.Add("date", article.Date.ToString("s"));
        }
    }
    

    Happily ever after...

    var serializer = new JavaScriptSerializer();
    
    serializer.RegisterConverters(
        new JavaScriptConverter[] {
            new ArticleJavaScriptConverter() 
        });
    
    var expected = new Article()
    {
        Id = 3,
        Title = "test",
        Date = DateTime.Now
    };
    
    
    // {"id":3,"title":"test","date":"2009-12-02T05:12:00"}
    var json = serializer.Serialize(article);
    
    var actual = serializer.Deserialize
    (json); Assert.AreEqual(expected, actual);

提交回复
热议问题