Custom JavaScriptConverter for DateTime?

前端 未结 10 790
走了就别回头了
走了就别回头了 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:36

    Here's an enhancement for the accepted answer.

    Using generics, passing a type and using reflection to determine the datetime properties.

    public class ExtendedJavaScriptConverter : JavaScriptConverter where T : new()
    {
        private const string _dateFormat = "dd/MM/yyyy";
    
        public override IEnumerable SupportedTypes
        {
            get
            {
                return new[] { typeof(T) };
            }
        }
    
        public override object Deserialize(IDictionary dictionary, Type type, JavaScriptSerializer serializer)
        {
            T p = new T();
    
            var props = typeof(T).GetProperties();
    
            foreach (string key in dictionary.Keys)
            {
                var prop = props.Where(t => t.Name == key).FirstOrDefault();
                if (prop != null)
                {
                    if (prop.PropertyType == typeof(DateTime))
                    {
                        prop.SetValue(p, DateTime.ParseExact(dictionary[key] as string, _dateFormat, DateTimeFormatInfo.InvariantInfo), null);
    
                    }
                    else
                    {
                        prop.SetValue(p, dictionary[key], null);
                    }
                }
            }                  
    
            return p;
        }      
    
        public override IDictionary Serialize(object obj, JavaScriptSerializer serializer)
        {
            T p = (T)obj;
            IDictionary serialized = new Dictionary();
    
            foreach (PropertyInfo pi in typeof(T).GetProperties())
            {
                if (pi.PropertyType == typeof(DateTime))
                {
                    serialized[pi.Name] = ((DateTime)pi.GetValue(p, null)).ToString(_dateFormat);
                }
                else
                {
                    serialized[pi.Name] = pi.GetValue(p, null);
                }
    
            }
    
            return serialized;
        }
    
        public static JavaScriptSerializer GetSerializer() 
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            serializer.RegisterConverters(new[] { new ExtendedJavaScriptConverter() });
    
            return serializer;
        }
    }
    

    Usage is simple:

     JavaScriptSerializer serialiser = ExtendedJavaScriptConverter.GetSerializer();
    

    Hope that helps someone.

提交回复
热议问题