1. 程式人生 > 其它 >【c#】JavaScriptSerializer 不序列化null值

【c#】JavaScriptSerializer 不序列化null值

JavaScriptSerializer 自定義轉換器, 不序列化null值 首先引用dll :System.Web.Extensions。 再自定義轉換器程式碼如下:
public class JavaScriptSerilizeConvert : JavaScriptConverter
    {
        //支援的需要轉換的型別,是集合可以是多個
        public override IEnumerable<Type> SupportedTypes =>  new List<Type>(new Type[] { typeof(Entity) });

        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            
//這樣寫,不管什麼型別的物件都能反序列化了 var t = Activator.CreateInstance(type); var props = type.GetProperties(); if (dictionary != null) { foreach (var item in dictionary) { //這裡有可能大小寫不同, //相容大小寫 var
p = props.Where(a => a.Name.ToLower() == item.Key.ToLower()).ToList(); if(p.Count>1) p = props.Where(a => a.Name== item.Key).ToList(); if (p.Count > 0) { int val = 0;
if (p[0].PropertyType == typeof(int)) { if (int.TryParse(item.Value.ToString(), out val)) { p[0].SetValue(t, val); } }// else if double 這裡要判斷double 其他也一樣 else { p[0].SetValue(t, item.Value); } } } return t; } return null; } public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) { //不同的型別實體可以做不同的處理 if (obj is Entity) { Entity t = obj as Entity; var dic= new Dictionary<string, object>(); var type = t.GetType(); var props = type.GetProperties(); foreach (var item in props) { var val = item.GetValue(obj); if (val != null) { dic.Add(item.Name, val); } } return dic; } else { return new Dictionary<string, object>(); } } }
控制檯測試程式:
static void Main(string[] args)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();

            var entity = new Entity();

            entity.Id = 1;
            entity.Name = null;
            entity.Des = "123";
            可以註冊多個自定義轉換器
            serializer.RegisterConverters(new JavaScriptConverter[] { new JavaScriptSerilizeConvert() });
            var str = serializer.Serialize(entity);

            Console.WriteLine(str);

            //這裡需要注意 一般在不用轉換器的情況下 如果實體裡屬性Id的型別是int型別,
            //這裡2出就不要加雙引號,不然報錯
            //我這裡在自定義轉換器上做了處理,所以能夠把string型別的2轉換成int型。
            var str2 = "{ \"Id\":\"2\",\"Name\":null,\"Des\":\"\"}";
            var en2 = serializer.Deserialize<Entity>(str2);
            Console.WriteLine(en2.Id);
            Console.ReadLine();
        }
實體Entity:
public   class Entity
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Des { get; set; }
    }

這是簡單的實體,如果有實體巢狀,也沒關係,如果是都不序列化null,public override IEnumerable<Type> SupportedTypes => new List<Type>(new Type[] { typeof(Entity),typeof(SubEntity) });這裡加上就行